Chinaunix首页 | 论坛 | 博客
  • 博客访问: 654392
  • 博文数量: 128
  • 博客积分: 4385
  • 博客等级: 上校
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 14:05
文章分类

全部博文(128)

文章存档

2012年(2)

2011年(51)

2010年(75)

分类: 嵌入式

2011-10-14 13:47:56

由于已经完成了第一个HELLO程序,标志着整个编译环境已经没有问题了,下来准备做一下串口测试程序。由于串口驱动开发板已经作好了,所以就作一个Linux串口测试工具简单的数据收发看看。

Linux串口测试工具网上常见的版本都看起来比较烦琐,下面是一个简单一点的,这个程序功能是收到10个字节后会发前7个字节,如果所发的数据的第一个字节是9则退出。
 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <string.h>
  7. #include <termio.h>
  8. #include <time.h>

  9. #define BAUDRATE B9600
  10. #define MODEMDEVICE "/dev/ttyUSB1"



  11. int main()
  12.  {
  13.  int fd,c=0,res;
  14.  struct termios oldtio,newtio;
  15.  //intch;
  16.  static char s1[10],buf[10];
  17.  printf("start ...\n");
  18.  /*打开PC的COM1口*/
  19.  fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY);
  20.  if (fd < 0)
  21.  {
  22.  perror(MODEMDEVICE);
  23.  exit(1);
  24.  }
  25.  printf("open...\n");
  26.  /*将旧的通讯参数存入oldtio结构*/
  27.  tcgetattr(fd,&oldtio);
  28.  /*初始化新的newtio */
  29.  bzero(&newtio,sizeof(newtio));
  30.  /*8N1*/
  31.  newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
  32.  newtio.c_iflag = IGNPAR;
  33.  newtio.c_oflag = 0;
  34.  /*正常模式*/
  35.  /*newtio.c_lflag = ICANON;*/

  36.  /*非正常模式*/
  37.  newtio.c_lflag = 0;
  38.  newtio.c_cc[VTIME] = 0;
  39.  newtio.c_cc[VMIN] = 10;

  40.  tcflush(fd,TCIFLUSH);
  41.  /*新的temios作为通讯端口参数*/
  42.  tcsetattr(fd,TCSANOW,&newtio);
  43.  printf("writing...\n");

  44.  while(1)
  45.  {
  46.  //printf("read...\n");
  47. res = read(fd,buf,10);
  48. //res = read(fd,s1,10);
  49. //strcat(buf,s1);
  50. // res = write(fd,buf,7);
  51.  printf("buf = %s\n", buf);
  52.  if(buf[0]==9) break;
  53.  }

  54.  printf("close...\n");
  55.  close(fd);
  56.  /*还原旧参数*/
  57.  tcsetattr(fd,TCSANOW,&oldtio);
  58.  return 0;
  59.  }


还有一点要注意,就是Linux串口测试工具串口有两种工作模式,即正规模式和非正规模式,如果习惯在串口调试器中用16进制发送,此时串口应该为非正规模式才行。

下面是这两种模式的说明
Linux串口测试工具正规模式(CANONICAL或者COOKED)
此模式下,终端设备会处理特殊字符,并且数据传输是一次一行的方式,既按回车后才开始发送和接收数据。例如LINUX的SHELL。
Linux串口测试工具非正规模式(NON-CANONICAL或者RAW)
此模式下,终端设备不会处理特殊字符,并且数据传输是一次一个字符的方式,既不用按回车换行。例如LINUX的VIM。

阅读(6140) | 评论(1) | 转发(3) |
给主人留下些什么吧!~~

zhiliuyinian2013-12-16 17:35:55

谢谢了