由于已经完成了第一个HELLO程序,标志着整个编译环境已经没有问题了,下来准备做一下串口测试程序。由于串口驱动开发板已经作好了,所以就作一个Linux串口测试工具简单的数据收发看看。
Linux串口测试工具网上常见的版本都看起来比较烦琐,下面是一个简单一点的,这个程序功能是收到10个字节后会发前7个字节,如果所发的数据的第一个字节是9则退出。
- #include <stdio.h>
-
#include <stdlib.h>
-
#include <errno.h>
-
#include <unistd.h>
-
#include <fcntl.h>
-
#include <string.h>
-
#include <termio.h>
-
#include <time.h>
-
-
#define BAUDRATE B9600
-
#define MODEMDEVICE "/dev/ttyUSB1"
-
-
-
-
int main()
-
{
-
int fd,c=0,res;
-
struct termios oldtio,newtio;
-
//intch;
-
static char s1[10],buf[10];
-
printf("start ...\n");
-
/*打开PC的COM1口*/
-
fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY);
-
if (fd < 0)
-
{
-
perror(MODEMDEVICE);
-
exit(1);
-
}
-
printf("open...\n");
-
/*将旧的通讯参数存入oldtio结构*/
-
tcgetattr(fd,&oldtio);
-
/*初始化新的newtio */
-
bzero(&newtio,sizeof(newtio));
-
/*8N1*/
-
newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
-
newtio.c_iflag = IGNPAR;
-
newtio.c_oflag = 0;
-
/*正常模式*/
-
/*newtio.c_lflag = ICANON;*/
-
-
/*非正常模式*/
-
newtio.c_lflag = 0;
-
newtio.c_cc[VTIME] = 0;
-
newtio.c_cc[VMIN] = 10;
-
-
tcflush(fd,TCIFLUSH);
-
/*新的temios作为通讯端口参数*/
-
tcsetattr(fd,TCSANOW,&newtio);
-
printf("writing...\n");
-
-
while(1)
-
{
-
//printf("read...\n");
-
res = read(fd,buf,10);
-
//res = read(fd,s1,10);
-
//strcat(buf,s1);
-
// res = write(fd,buf,7);
-
printf("buf = %s\n", buf);
-
if(buf[0]==9) break;
-
}
-
-
printf("close...\n");
-
close(fd);
-
/*还原旧参数*/
-
tcsetattr(fd,TCSANOW,&oldtio);
-
return 0;
-
}
还有一点要注意,就是Linux串口测试工具串口有两种工作模式,即正规模式和非正规模式,如果习惯在串口调试器中用16进制发送,此时串口应该为非正规模式才行。
下面是这两种模式的说明
Linux串口测试工具正规模式(CANONICAL或者COOKED)
此模式下,终端设备会处理特殊字符,并且数据传输是一次一行的方式,既按回车后才开始发送和接收数据。例如LINUX的SHELL。
Linux串口测试工具非正规模式(NON-CANONICAL或者RAW)
此模式下,终端设备不会处理特殊字符,并且数据传输是一次一个字符的方式,既不用按回车换行。例如LINUX的VIM。
阅读(6140) | 评论(1) | 转发(3) |