linux C串口数据解析
@解析串口数据
串口初始化及配置
下面展示一些 串口相关初始化
。
/相关初始化/
pthread_t pSerial;
static const char *device = "/dev/ttyS1";
static int uartFd = 0;
int speed_arr[] = {B921600, B460800, B230400, B115200, B57600, B38400, B19200,B9600, B4800, B2400, B1200, B300,
};
int name_arr[] = {921600, 460800, 230400, 115200, 57600, 38400, 19200,9600, 4800, 2400, 1200, 300,
};
/设置串口速度/
void set_speed(int fd, int speed)
{int i;int status;struct termios Opt;tcgetattr(fd, &Opt);for ( i= 0; i < (int)(sizeof(speed_arr) / sizeof(int)); i++) {if (speed == name_arr[i]) {tcflush(fd, TCIOFLUSH);cfsetispeed(&Opt, speed_arr[i]);cfsetospeed(&Opt, speed_arr[i]);status = tcsetattr(fd, TCSANOW, &Opt);if (status != 0)perror("tcsetattr fd1");return;}tcflush(fd,TCIOFLUSH);}if (i == 12){printf("\tSorry, please set the correct baud rate!\n\n");}
}
/串口相关设置,停止位,校验位…/
int set_Parity(int fd,int databits,int stopbits,int parity)
{struct termios options;if ( tcgetattr( fd,&options) != 0) {perror("SetupSerial 1");return(FALSE);}options.c_cflag &= ~CSIZE ;switch (databits) /*脡猫脰脙脢媒戮脻脦禄脢媒*/ {case 7:options.c_cflag |= CS7;break;case 8:options.c_cflag |= CS8;break;default:fprintf(stderr,"Unsupported data size\n");return (FALSE);}switch (parity) {case 'n':case 'N':options.c_cflag &= ~PARENB; /* Clear parity enable */options.c_iflag &= ~INPCK; /* Enable parity checking */break;case 'o':case 'O':options.c_cflag |= (PARODD | PARENB); /* 脡猫脰脙脦陋脝忙脨搂脩茅*/options.c_iflag |= INPCK; /* Disnable parity checking */break;case 'e':case 'E':options.c_cflag |= PARENB; /* Enable parity */options.c_cflag &= ~PARODD; /* 脳陋禄禄脦陋脜录脨搂脩茅*/options.c_iflag |= INPCK; /* Disnable parity checking */break;case 'S':case 's': /*as no parity*/options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;break;default:fprintf(stderr,"Unsupported parity\n");return (FALSE);}/* 脡猫脰脙脥拢脰鹿脦禄*/switch (stopbits) {case 1:options.c_cflag &= ~CSTOPB;break;case 2:options.c_cflag |= CSTOPB;break;default:fprintf(stderr,"Unsupported stop bits\n");return (FALSE);}/* Set input parity option */if (parity != 'n')options.c_iflag |= INPCK;options.c_cc[VTIME] = 1; // 15 secondsoptions.c_cc[VMIN] = 128;options.c_lflag &= ~(ECHO | ICANON);options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);options.c_oflag &= ~OPOST;options.c_cflag |= CLOCAL | CREAD;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */if (tcsetattr(fd,TCSANOW,&options) != 0) {perror("SetupSerial 3");return (FALSE);}return (TRUE);
}
/打开串口/linux下查看串口 /dev/ttyS*
int OpenDev(const char *Dev)
{int fd = open( Dev, O_RDWR | O_NOCTTY | O_NDELAY);if (-1 == fd){perror("Can't Open Serial Port");return -1;} elsereturn fd;
}
*这里就是初始化串口一些信息调用以上的函数* __
void InitCom(const char *SeriName)
{// pthread_t pSerial;uartFd = OpenDev(SeriName);if (uartFd > 0){set_speed(uartFd, 19200);if (set_Parity(uartFd,8,1,'N')== FALSE){fprintf(stderr, "Set Parity Error\n");close(uartFd);return;}pthread_create(&pSerial,NULL,ReadComData,NULL);}else{ printf("Open %s Falied!\r\n",device);return;}
}
串口数据的解析
*启动线程接收* __
void InitCom(const char *SeriName)
{// pthread_t pSerial;uartFd = OpenDev(SeriName);if (uartFd > 0){set_speed(uartFd, 19200);if (set_Parity(uartFd,8,1,'N')== FALSE){fprintf(stderr, "Set Parity Error\n");close(uartFd);return;}pthread_create(&pSerial,NULL,ReadComData,NULL);/*线程函数在下面*/}else{ printf("Open %s Falied!\r\n",device);return;}
}
下面展示一些 接收串口数据解析
。
void * ReadComData(void *arg)
{printf("%s is running\r\n",__FUNCTION__);(void)arg;char buf[128];int rtn;int index = 0;char c;while(1){rtn = read(uartFd,&c,1);if(rtn > 0){/*接收到的数据开头为A*/if('A' == c){index = 1;buf[0] = c;}/*以换行结束,也就是在输入如:A123456\r,\r是在串口界面上输入发送信息的时候键盘上的回车*/else if('\r' == c){buf[index] = '\0';if('>' == buf[0]){printf("Recv data is:%s\r\n",buf);/**/}index = 0;}/*没找到继续找*/else{buf[index] = c;index++;if(index >= 128)index = 0;}}}return NULL;
}
linux C串口数据解析相关推荐
- Linux读取串口数据
一.前言 最近项目中需要在Linux系统下读取串口数据,由于使用的Ubantu系统,开发工具是Qt Creator,所以首先在网上百度了一下,找到了几篇博客,大致内容上都差不多.由于使用的Qt4,其没 ...
- 远程定位gps linux,GPS(NMEA)数据解析
一.GPS定位信息 设置好gps模式,启动gps,正常的话在gps通路有NMEA数据上报,如下: $GPGSV,3,1,11,01,62,130,42,07,61,201,43,11,72,075,2 ...
- linux下json数据解析,JSON数据解析 - iOS学习笔记_Linux编程_Linux公社-Linux系统门户网站...
在之前的<iOS学习--xml数据解析(九)>http://www.linuxidc.com/Linux/2014-02/97020p9.htm 介绍了xml数据解析,这一篇简单介绍一下J ...
- linux下json数据解析,Linux下使用jq简单解析json的方法
jq简介 jq 是一款命令行下处理 JSON 数据的工具.其可以接受标准输入,命令管道或者文件中的 JSON 数据,经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将结果输出 ...
- 基于TencentOS-tiny实现PM2.5传感器(攀藤PMSA003)数据解析思路及实现
说明:此文章提供了一种基于TencentOS-tiny的串口数据解析思路及实现,感谢戴大神最初写的源码,这种思路同样可以实现AT框架.基于串口的GPS数据解析等等. 1. PM2.5传感器 本文使用的 ...
- python 3下对stm32串口数据做解析
1.最近有个想做一个传感器数据实时显示的上位机,常规的数据打印太频繁了,无法直观的看出数据的变化. python下的上位机实现起来简单一点,网上找了一些python界面Tkinter相关资料和pyth ...
- Android(Linux)实时监控串口数据
之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...
- Linux下串口编程遇 接收数据错误问题及原因
近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一:另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二. 由于问题莫名其 ...
- jy61 树莓派_用Linux树莓派来读取JY61的串口数据
简述 有很多的小伙伴说用Linux树莓派来读取JY61的串口数据不知道怎么操作.今天我和大家分享下我是从三个方面分享的.1.JY61和树莓派的连接方式及VNC的使用:2.下载到树莓派的程序是如何编写的 ...
最新文章
- Document对象内容集合
- java多线程 门闩_Java线程与并发编程实践----同步器(倒计时门闩,同步屏障)...
- React Fiber 原理介绍
- Ubuntu中配置SSH服务
- CMOS图像传感器——噪声模型
- 三、SpringBoot-application.properties配置文件和application.yml配置文件
- Java程序开发三步骤:编写、编译、运行
- nil,Nil,NULL,NSNull
- 有关 给Layout设置监听事件后,与Layout子控件的响应关系
- Matrix: android 中的Matrix (android.graphics.Matrix) (转)
- 造车梦又要“窒息”了?贾跃亭被美国认定骗局,收到退市警告!FF回应了......
- 苹果新Mac Pro生产线将从美国转至中国 会更便宜吗?
- 平面设计中应当注意的设计原则
- markdown首行空两格
- sql server数据库《音乐网站》项目歌曲管理模块
- MATLAB 线型图
- mysql odbc 免安装_MySQL免安装版配置
- java excel checkbox,使用Apache POI(Java)在XLSX中创建复选框
- 第26课时,实践4,定期存款利息计算器
- 347. Top K Frequent Elements