Linux串口测试工具简单程序代码解析

Linux串口测试工具简单程序代码解析

2010-05-28 10:53 佚名 我要评论(0) 字号: T | T
一键收藏,随时查看,分享好友!

网上常见的版本都看起来比较烦琐,今天介绍是一个简单一点的,和大家一起学习了解,以下是程序的具体代码

AD:2013大数据全球技术峰会低价抢票中

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

Linux串口测试工具网上常见的版本都看起来比较烦琐,下面是一个简单一点的,这个程序功能是收到10个字节后会发前7个字节,如果所发的数据的第一个字节是9则退出。
/* rs232_send.c*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineBAUDRATEB115200//38400
#defineMODEMDEVICE"/dev/ttyS1"
int main()
{
int fd,c=0,res;
struct termios oldtio,newtio;
intch;
static char s1[20],buf[19];
printf("start ...\n");
/*打开PC的COM1口*/
fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY);
if (fd
{
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;
}
还有一点要注意,就是Linux串口测试工具串口有两种工作模式,即正规模式和非正规模式,如果习惯在串口调试器中用16进制发送,此时串口应该为非正规模式才行。

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

-----------------------------------

下边的程序是我测试成功的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <utils/Log.h>
#include <termios.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/time.h>
#define UART_DEV_PATH        "/dev/ttyMT0"

int main(void)
{
  int fd=-1;
  int i,res,test;
  struct termios oldtio;
  static char buf_data[20]={
          0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
          0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  };
 char buf[20],buf_rec[20];
 printf("meta_uart test 1111=%d\r\n",buf_data[0]);
  memset(buf_rec,0,sizeof(buf_rec));
  fd = open(UART_DEV_PATH, O_RDWR);
 
  if(fd<0)
  {
    printf("meta_uart_test: open %s failed\n", UART_DEV_PATH);
    //snprintf(buf, PAGE_SIZE, "%s\n",buf);
  }



  //fcntl(fd, F_SETFL, 0);
  // Get the current options:
  tcgetattr(fd, &oldtio);

  // Set 8bit data, No parity, stop 1 bit (8N1):
  oldtio.c_cflag &= ~PARENB;
  oldtio.c_cflag &= ~CSTOPB;
  oldtio.c_cflag &= ~CSIZE;
  oldtio.c_cflag |= CS8 | CLOCAL | CREAD;

  // Raw mode
  oldtio.c_iflag &= ~(INLCR | ICRNL | IXON | IXOFF | IXANY);
  oldtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  /*raw input*/
  oldtio.c_oflag &= ~OPOST;  /*raw output*/


  tcflush(fd,TCIFLUSH);//clear input buffer
  oldtio.c_cc[VTIME] =100; /* inter-character timer unused */
  oldtio.c_cc[VMIN] = 1; /* blocking read until 0 character arrives */


  cfsetispeed(&oldtio, B9600);
  cfsetospeed(&oldtio, B9600);
  /*
   * Set the new options for the port...
   */
  tcsetattr(fd, TCSANOW, &oldtio);
 // tcgetattr(fd, &oldtio);

  //oldtio.c_iflag=0;
 // tcsetattr(fd,TCSANOW,&oldtio);
   tcflush(fd, TCIOFLUSH);


snprintf(buf, sizeof(buf_data), "%s",buf_data);
while(1)
{
  res = read(fd,buf_rec,20);
  tcflush(fd, TCIOFLUSH);

if (buf_rec[0]==0x87)
{
    usleep(1000*5000);
#if 1
for(i=0;i<20;i++)
{
     res = write(fd,(buf_data+i),1);
   // printf("write buffer_data =%x i=%d", *(buf_data),i);
    printf("write buffer_rec =%x i=%d\n", *(buf_rec+i),i);
}
#endif
break;
}

}
close(fd);

return res;
}

你可能感兴趣的:(Linux串口测试工具简单程序代码解析)