linux 串口接收

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <sys/types.h>
  5 #include <sys/stat.h>
  6 #include <fcntl.h> //文件控制定义
  7 #include <termios.h>//终端控制定义
  8 #include <errno.h>
  9
 10 char *comport;
 11 int bRate = 0;
 12
 13 int serial_fd = 0;
 14
 15 //打开串口并初始化设置
 16 int init_serial(void)
 17 {
 18     serial_fd = open(comport, O_RDWR | O_NOCTTY | O_NDELAY);
 19     if (serial_fd < 0) {
 20         perror("open");
 21         return -1;
 22     }
 23     else
 24         printf("open %s success! \n", comport);
 25
 26     //串口主要设置结构体termios <termios.h>
 27     struct termios options;
 28
 29     /**1. tcgetattr函数用于获取与终端相关的参数。
 30     *参数fd为终端的文件描述符,返回的结果保存在termios结构体中
 31     */
 32     tcgetattr(serial_fd, &options);
 33     /**2. 修改所获得的参数*/
 34     options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能
 35     options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位
 36     options.c_cflag &= ~CRTSCTS;//无硬件流控
 37     options.c_cflag |= CS8;//8位数据长度
 38     options.c_cflag &= ~CSTOPB;//1位停止位
 39     options.c_iflag |= IGNPAR;//无奇偶检验位
 40     options.c_oflag = 0; //输出模式
 41     options.c_lflag = 0; //不激活终端模式
 42
 43     switch(bRate)
 44     {
 45     case 9600:cfsetospeed(&options, B9600);break;//设置波特率
 46     case 115200:cfsetospeed(&options, B115200);break;//设置波特率
 47     }
 48
 49     /**3. 设置新属性,TCSANOW:所有改变立即生效*/
 50     tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读
 51     tcsetattr(serial_fd, TCSANOW, &options);
 52
 53     return 0;
 54 }
 55
 56 void uart_recv(int fd)
 57 {
 58     char data[1024];
 59     int len=0, ret = 0;
 60     fd_set fs_read;
 61     struct timeval tv_timeout;
 62
 63     FD_ZERO(&fs_read);
 64     FD_SET(fd, &fs_read);
 65     tv_timeout.tv_sec  = 6000;//(10*20/115200+2);
 66     tv_timeout.tv_usec = 0;
 67
 68     while (1)
 69     {
 70         ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout);
 71         //printf("ret = %d\n", ret);
 72         if (FD_ISSET(fd, &fs_read)) {
 73             len = read(fd, data, sizeof(data));
 74             printf("len: %d(bytes) recv: %s\n", len, data);
 75         } else {
 76             perror("select");
 77         }
 78     }
 79 }
 80
 81 int main(int argc, char **argv)
 82 {
 83     comport = (char *)malloc(1024);
 84     memset(comport, ‘\0‘, sizeof(comport));
 85     if (argc == 1)
 86     {
 87         comport = "/dev/ttyS6";
 88         bRate = 9600;
 89     }
 90     else if (argc == 3)
 91     {
 92         switch(atoi(argv[1]))
 93         {
 94         case 0:comport = "/dev/ttyS0";break;
 95         case 1:comport = "/dev/ttyS1";break;
 96         case 2:comport = "/dev/ttyS2";break;
 97         case 3:comport = "/dev/ttyS3";break;
 98         case 4:comport = "/dev/ttyS4";break;
 99         case 5:comport = "/dev/ttyS5";break;
100         case 6:comport = "/dev/ttyS6";break;
101         default: printf("argv[0](com port id) should be 0 to 6 !\n");exit(0);
102         }
103         switch(atoi(argv[2]))
104         {
105         case 9600: bRate = 9600; break;
106         case 115200: bRate = 115200; break;
107         default: printf("argv[1](bRate) should be 9600 or 115200 !\n");exit(0);
108         }
109     }
110     else{
111         printf("parameter count error!\n");
112         return 0;
113     }
114
115     init_serial();
116     printf("current BaudRate is %d\n", bRate);
117     //uart_send(serial_fd, buf, sizeof(buf));
118     uart_recv(serial_fd);
119     free(comport);
120     close(serial_fd);
121     return 0;
122 }
时间: 2024-11-05 12:22:12

linux 串口接收的相关文章

Linux串口接收不到0X11数据

转自:http://www.2cto.com/os/201302/189931.html linux串口接收不到0x11解决 网上许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉.不用说也知道,这几个肯定是特殊字符,被用作特殊控制了.关掉ICRNL和IXON选项即可解决. www.2cto.com c_iflag &= ~(ICRNL | IXO

linux串口接收0x03等特殊字符的问题

近日在写一个linux的串口程序,发现大多数情况下数据接收没问题,但是有时却有问题.主要是接收的字符串中包含有0x03这个字符,会造成与它相邻的字符同时也接收不到,搞了好久才发现这个错误.查找资料后发现许多ARM板也存着这个问题,存在问题的字符串还包括0x13.0x0D等特殊含义的字符. 解决方法 方法比较简单,在接收数据前,对串口的文件描述符fd进行如下设置, <pre name="code" class="cpp">struct termios op

Smart210学习记录------linux串口驱动

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=27025492&id=327609 一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在<#include linux/serial_core.h> 1.uart_driver uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver). struct

linux 串口0x03,0x13的问题【转】

linux 串口0x03,0x13的问题 本人最近在调linux串口的时候,发现其他数据接收正常,但是0x13怎么也接收不到,后面发现了这篇文章,两天的bug终于解决了,原来是linux底层uart配置问题,现分享给大家 版权所有,转载必须说明转自 http://my.csdn.net/weiqing1981127 原创作者:南京邮电大学  通信与信息系统专业 研二 魏清 环境:mini2440,fl6410,atmel9g45都会出现这样的问题 问题描述:使用RS485串口标准通信,发现大多数

linux串口驱动分析

linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作.UART 使用系统时钟能够支持最高 115.2Kbps 的波特率.每一个 UART 通道对于接收器和发送器包含了 2 个 64 位的 FIFO. 寄存器 名称 地址 在linux中的描写叙述 (2410 和 2440 处理器对内存地址映射关系同样) UART 线性控制寄存器(ULCONn) ULC

linux串口编程参数配置详解

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义 #include <stdlib.h>        //标准函数库定义 #include <unistd.h>       //Unix标准函数定义 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>          //文件控制定义 #incl

Linux串口编程详解

串口本身,标准和硬件 ? 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口.虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代:而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之.但是,一方面因为串口本身造价便宜技术成熟,

linux串口编程参数配置详解(转)

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义#include <stdlib.h>        //标准函数库定义#include <unistd.h>       //Unix标准函数定义#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>          //文件控制定义#include &l

linux 串口 特殊字符

近日在写一个linux的串口程序,发现大多数情况下数据接收没问题,但是有时却有问题.主要是接收的字符串中包含有0x03这个字符,会造成与它相邻的字符同时也接收不到,搞了好久才发现这个错误.查找资料后发现许多ARM板也存着这个问题,存在问题的字符串还包括0x13.0x0D等特殊含义的字符. 解决方法 方法比较简单,在接收数据前,对串口的文件描述符fd进行如下设置, [cpp] view plaincopyprint? <pre name="code" class="cpp