简单串口读写程序的实现过程:(1)在 Linux 下串口文件是位于 /dev 下的
串口一 为 /dev/ttyS0
串口二 为 /dev/ttyS1
(2)打开串口是通过使用标准的文件打开函数操作:
int fd;
fd=open("/dev/ttyS0",O_RDWR);
if(fd==-1)
{
printf("can't open ttyS0!\n");
exit(0);
}
(3)设置串口
串口的设置主要是设置 struct termios 结构体的各成员值。
struct termio
{ unsigned short c_iflag; /* 输入模式标志 */
unsigned short c_oflag; /* 输出模式标志 */
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /* 区域模式标志 */
unsigned char c_line; /* 行控制 */
unsigned char c_cc[NCC]; /* 控制特性 */
};
最基本的设置串口包括波特率设置,效验位和停止位设置。new.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;
/* BAUDRATE:波特率
CS8 : 8n1 (8 位元, 不做同位元检查,1 个终止位元)
CLOCAL : 本地连线, 不具数据机控制功能
CREAD : 致能接收字元
*/
new.c_iflag=IGNPAR|ICRNL;
/*
IGNPAR : 忽略经同位元检查後, 错误的位元组
ICRNL : 比 CR 对应成 NL (否则当输入讯号有 CR 时不会终止输入)
在不然把装置设定成 raw 模式(没有其它的输入处理)
*/
new.c_oflag=0;
new.c_lflag = 0;
new.c_cc[VTIME] = 0;/* 不使用分割字元组计时器 */
new.c_cc[VMIN] = 5;/* 在读取到 5 个字元前先停止 */
(4)读写串口
设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。
读串口显示在屏幕:
tmp=read(fd,str,50);
write(1,str,tmp);/*这里的1是标准的屏幕输出*/
写串口从键盘读:
tmp=read(0,str,50);/*这里的0是标准的键盘读*/
write(fd,str,tmp);
(5)关闭串口
关闭串口就像关闭文件一样。 close(fd);
******************************实例********************************下面是一个简单的读写串口的例子。
#include
#include
#include
#include
#include
#include
#include
#include
#define BAUDRATE B115200 /*波特率为B115200*/
int main()
{
int fd,pid,tmp;
char str[255];
struct termios new;
fd=open("/dev/ttyS0",O_RDWR);/*打开串口*/
if(fd==-1)
{
printf("can't open ttyS0!\n");
exit(0);
}
bzero(&new, sizeof(new));/* 清除结构体以放入新的序列埠设定值 */
new.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;
/* CS8 : 8n1 (8 位元, 不做同位元检查,1 个终止位元)
CLOCAL : 本地连线, 不具数据机控制功能
CREAD : 致能接收字元
*/
new.c_iflag=IGNPAR|ICRNL;
/*
IGNPAR : 忽略经同位元检查後, 错误的位元组
ICRNL : 比 CR 对应成 NL (否则当输入讯号有 CR 时不会终止输入)
在不然把装置设定成 raw 模式(没有其它的输入处理)
*/
new.c_oflag=0;
new.c_lflag = 0;
new.c_cc[VTIME] = 0;/* 不使用分割字元组计时器 */
new.c_cc[VMIN] = 5;/* 在读取到 5 个字元前先停止 */
/*现在清除数据机线并启动序列埠的设定*/
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&new);
pid=fork();
if(pid<0)
printf("error\n");
else if(pid==0)
{ /*从串口读数据然后在屏幕显示出来*/
while((tmp=read(fd,str,50))>0)
{
write(1,str,tmp);
}
}
else
{ /*从键盘读数据然后写进串口*/
while((tmp=read(0,str,50))>0)
{
write(fd,str,tmp);
}
}
close(fd);/*关闭串口*/
return 0;
}
阅读(2076) | 评论(0) | 转发(0) |