原创 以9260EK-串口测试程序

2008-7-18 16:58 2204 1 1 分类: MCU/ 嵌入式

串口测试程序


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

网上常见的版本都看起来比较烦琐,呵呵,写一个简单一点的,功能是收到10个字节后会发前7个字节,如果所发的数据的第一个字节是9则退出。


/* rs232_send.c*/


#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <termios.h>

#include <stdio.h>  

#include <string.h>

#include <unistd.h>

#include <errno.h>    

#include <stdlib.h>

 

#define  BAUDRATE      B115200//38400

#define  MODEMDEVICE   "/dev/ttyS1"

int main()

{

   int    fd,c=0,res;

   struct termios oldtio,newtio;

   int   ch;

   static char s1[20],buf[19];

   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)

   {

      res = read(fd,buf,10);

      res = write(fd,buf,7);

      if(buf[0]==9) break;

   }

   

   printf("close...\n");

   close(fd);

   /*还原旧参数*/

   tcsetattr(fd,TCSANOW,&oldtio);

   return 0;

}


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

下面是这两种模式的说明

正规模式(CANONICAL或者COOKED)

此模式下,终端设备会处理特殊字符,并且数据传输是一次一行的方式,既按回车后才开始发送和接收数据。例如LINUX的SHELL。

非正规模式(NON-CANONICAL或者RAW)

此模式下,终端设备不会处理特殊字符,并且数据传输是一次一个字符的方式,既不用按回车换行。例如LINUX的VIM。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /3 下一条