6410的串口驱动

  1. ***************************  
  2.  *基于OK6410的串口程序  
  3.  *2012.12.4  
  4.  *孙旭  
  5.  ***************************/  
  6.   
  7. #include<stdio.h>  
  8. #include<stdlib.h>  
  9. #include<string.h>  
  10. #include<sys/types.h>  
  11. #include<sys/stat.h>  
  12. #include<fcntl.h>  
  13. #include<unistd.h>  
  14. #include<termios.h>  
  15. #include<string.h>  
  16.   
  17. /*串口设置,"串口,波特率,数据位,奇偶校验,停止位"*/  
  18. int set_Baudrate(int fd,int nSpeed, int nBits, char nEvent, int nStop)  
  19. {  
  20.  struct termios newtio,oldtio;  
  21.   
  22.  //保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息  
  23.  if(tcgetattr(fd,&oldtio) != 0)  
  24.  {   
  25.   perror("SetupSerial 1");  
  26.   return -1;  
  27.  }  
  28.  bzero( &newtio, sizeof( newtio ) );  
  29.   
  30.  //设置字符大小  
  31.  newtio.c_cflag  |=  CLOCAL | CREAD;  
  32.  newtio.c_cflag &= ~CSIZE;  
  33.   
  34.  //数据位的设置  
  35.  switch( nBits )  
  36.  {  
  37.  case 7:  
  38.   newtio.c_cflag |= CS7;  
  39.   break;  
  40.  case 8:  
  41.   newtio.c_cflag |= CS8;  
  42.   break;  
  43.  }  
  44.   
  45.  //奇偶校验的设置  
  46.  switch( nEvent )  
  47.  {  
  48.  case 'O':      //奇数  
  49.   newtio.c_cflag |= PARENB;  
  50.   newtio.c_cflag |= PARODD;  
  51.   newtio.c_iflag |= (INPCK | ISTRIP);  
  52.   break;  
  53.  case 'E':     //偶数  
  54.   newtio.c_iflag |= (INPCK | ISTRIP);  
  55.   newtio.c_cflag |= PARENB;  
  56.   newtio.c_cflag &= ~PARODD;  
  57.   break;  
  58.  case 'N':     //无奇偶校验位  
  59.   newtio.c_cflag &= ~PARENB;  
  60.   break;  
  61.  }  
  62.   
  63.  //波特率的设置  
  64.  switch( nSpeed )  
  65.  {  
  66.  case 2400:  
  67.   cfsetispeed(&newtio, B2400);  
  68.   cfsetospeed(&newtio, B2400);  
  69.   break;  
  70.  case 4800:  
  71.   cfsetispeed(&newtio, B4800);  
  72.   cfsetospeed(&newtio, B4800);  
  73.   break;  
  74.  case 9600:  
  75.   cfsetispeed(&newtio, B9600);  
  76.   cfsetospeed(&newtio, B9600);  
  77.   break;  
  78.  case 115200:  
  79.   cfsetispeed(&newtio, B115200);  
  80.   cfsetospeed(&newtio, B115200);  
  81.   break;  
  82.  case 460800:  
  83.   cfsetispeed(&newtio, B460800);  
  84.   cfsetospeed(&newtio, B460800);  
  85.   break;  
  86.  default:  
  87.   cfsetispeed(&newtio, B9600);  
  88.   cfsetospeed(&newtio, B9600);  
  89.   break;  
  90.  }  
  91.   
  92.  //停止位的设置  
  93.  if( nStop == 1 )  
  94.   newtio.c_cflag &=  ~CSTOPB;  
  95.  else if ( nStop == 2 )  
  96.   newtio.c_cflag |=  CSTOPB;  
  97.   
  98.  //设置等待时间和最小接收字符  
  99.  newtio.c_cc[VTIME]  = 0;  
  100.  newtio.c_cc[VMIN] = 0;  
  101.   
  102.  //处理为接收字符  
  103.  tcflush(fd,TCIFLUSH);  
  104.   
  105.  //激活新配置  
  106.  if((tcsetattr(fd,TCSANOW,&newtio))!=0)  
  107.  {  
  108.   perror("com set error");  
  109.   return -1;  
  110.  }  
  111.   
  112.  return 0;  
  113. }  
  114.   
  115. /*数据解析*/  
  116. int analysis_data(char buf[100])  
  117. {  
  118.  printf("recv data %s \n",buf);  
  119. }  
  120.   
  121. /*波特率为115200串口0*/  
  122. int serial_port0(void)  
  123. {   
  124.  int fd_port;  
  125.  int return_value=0;  
  126.  int length_data=0;  
  127.  char buffer[100];    //从串口读取数据的buffer  
  128.  memset(buf,0,sizeof(buf));  
  129.   
  130.  //打开串口0  
  131.  fd_port = open("/dev/ttySAC0",O_RDWR);  
  132.  if(-1 == fd_port)  
  133.  {  
  134.   exit(1);  
  135.  }  
  136.     
  137.  //串口,波特率,数据位,奇偶校验,停止位  
  138.  return_value = set_Baudrate(fd_port,115200,8,'N',1);  
  139.  if(-1 == return_value)  
  140.  {  
  141.   exit(1);  
  142.  }  
  143.   
  144.  //接收串口0的数据  
  145.  while(1)  
  146.  {  
  147.   length_data = read(fd_port,buf,1);  //数据的发送使用write(fd_port,buf,1); buf为要发送的字符串  
  148.   if(-1 == length_data)  
  149.   {  
  150.    exit(1);  
  151.   }  
  152.     
  153.   if(0 > analysis_data(buf))  
  154.    return -1;  
  155.   
  156.   memset(buf,0,100);  
  157.  }  
  158.   
  159.  close(fd_port);  
  160.  return 1;  
  161. }  
  162.   
  163. /*波特率为4800串口1*/  
  164. int serial_port1(void)  
  165. {   
  166.  int fd_port;  
  167.  int return_value=0;  
  168.  int length_data=0;  
  169.  char buffer[100];    //从串口读取数据的buffer  
  170.  memset(buf,0,sizeof(buf));  
  171.   
  172.  //打开串口1  
  173.  fd_port = open("/dev/ttySAC1",O_RDWR);  
  174.  if(-1 == fd_port)  
  175.  {  
  176.   return -1;  
  177.  }  
  178.     
  179.  //串口,波特率,数据位,奇偶校验,停止位  
  180.  return_value = set_Baudrate(fd_port,4800,8,'N',1);  
  181.  if(-1 == return_value)  
  182.  {  
  183.   return -1;  
  184.  }  
  185.   
  186.  //接收串口1的数据  
  187.  while(1)  
  188.  {  
  189.   length_data = read(fd_port,buf,1); //数据的发送使用write(fd_port,buf,1);  
  190.   if(-1 == length_data)  
  191.   {  
  192.    exit(1);  
  193.   }  
  194.     
  195.   if(0 > analysis_data(buf))  
  196.    return -1;  
  197.   
  198.   memset(buf,0,100);  
  199.  }  
  200.  close(fd_port);  
  201.  return 1;  
  202. }  
  203.   
  204. /*主函数*/  
  205. int main(void)  
  206. {  
  207.  if(0 > serial_port0())  
  208.  {  
  209.   exit(1);  
  210.  }  
  211.   
  212.  if(0 > serial_port1())  
  213.  {  
  214.   exit(1);  
  215.  }  
  216.  return 0;  
  217. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值