串口每次read数据可能不是完整的数据,参照网上的代码,写了拼帧的代码#include <stdio.h>

#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <strings.h>
#include <sys/time.h>
#include <sys/types.h> int speed_arr[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300};
int name_arr[] = { , , , , , , , , }; /**
*@brief Set Serial Port BitRate
*@param fd Type : int The File Description of Serial Port
*@param speed Type : int Serial Speed
*@return void
*/
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for( i=; i < (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 != )
{
perror("tcsetattr fd");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
} /**
*@brief Set Serial Port Databits, Stopbits and Parity.
*@param fd Type: int The File Description of Serial Port
*@param databits Type: int Databits 7 or 8
*@param stopbits Type: int Stopbits 1 or 2
*@param parity Type: int Parity Type: n,N,e,E,o,O,s,S
*/
int set_Parity(int fd, int databits, int parity, int stopbits)
{
struct termios options;
if ( tcgetattr( fd,&options) != )
{
perror("SetupSerial 1");
return(-);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*Set Datebits*/
{
case :
options.c_cflag |= CS7;
break;
case :
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n");
return(-);
} switch (parity) /*Set 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); /* Odd Checking*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* Even Checking*/
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(-);
} switch (stopbits) /*Set Stobits*/
{
case :
options.c_cflag &= ~CSTOPB;
break;
case :
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return(-);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK; /*以下两句添加后发送方可以不加回车换行,但是read读取不完整*/
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/ //屏蔽功能: NL(换行)->CR(回车)、CR->NL、忽略输入回车
options.c_iflag &= ~(INLCR | ICRNL | IGNCR);
options.c_oflag &= ~(ONLCR | OCRNL); tcflush(fd,TCIFLUSH);
//未设置O_NONBLOCK或O_NDELAY
options.c_cc[VTIME] = ; /* Timeout in 15 seconds*/
options.c_cc[VMIN] = ; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != )
{
perror("SetupSerial 3");
return(-);
}
return();
} void print_frame(unsigned char *buf,int size)
{
int i;
for(i = ; i < size; i++)
{
printf("0x%x ", buf[i]);
}
printf("\n");
} void getCompleteFrame(unsigned char *inBuf,int inCnt,unsigned char *outBuf,int *destCnt,int *readStatus)
{
int i;
for(i = ; i < inCnt; i++)
{
if(inBuf[i] == 0x01 && inBuf[i+] == 0x03)//header
{
outBuf[(*destCnt)++] = inBuf[i];
*readStatus = ;
continue;
}
if(*readStatus == )//body
{
outBuf[(*destCnt)++] = inBuf[i];
}
if(*destCnt == outBuf[] && *readStatus == )//tail
{
print_frame(outBuf,*destCnt);
*readStatus = ;
*destCnt = ;
memset(outBuf, -, sizeof(outBuf));
// memset(inBuf,0,sizeof(inBuf));
continue;
}
}
} int main(void)
{
unsigned char battery_msg[];
int fd;
unsigned char read_buf[] = {};
int nread = ;
fd = open("/dev/ttyS0", O_RDWR|O_NOCTTY);
if (fd > )
{
printf("Open Port Success!\n");
}
else
{
printf("Can't Open port\n");
return(-);
} set_speed(fd, );
if(set_Parity(fd, , 'N', ) == -)
{
close(fd);
return(-);
}
int i = , rc = ;
int flag = ;
fd_set rset;
struct timeval tv;
int read_status = ;
int dest_cnt = ; while () //循环读取数据
{
FD_ZERO(&rset);
FD_SET(fd, &rset); tv.tv_sec = ;
tv.tv_usec = ; rc = select(fd+, &rset, NULL, NULL, &tv); if(rc > )
{
      if(FD_ISSET(fd_485C2, &rset))
      {
memset(read_buf, , sizeof(read_buf));
usleep();
nread = read(fd, read_buf, sizeof(read_buf));
// printf("read %d data\n", nread);
if(nread > )
{
getCompleteFrame(read_buf, nread, battery_msg,&dest_cnt,&read_status);
}
      }
}
}
close(fd);
return ;
}

linux 串口 拼帧处理的更多相关文章

  1. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  2. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

  3. linux -- 串口调试总结

    linux 串口输出调试 在某些情况下,需要同时对两台或多台Linux主机进行管理和操作.如果手头缺少足够多的键盘和显示器,那么通过一台机器的串口对其余主机进行控制不失为一种快捷.有效的方法. 下面就 ...

  4. Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用

    Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用 在串口编程模式下,open未设置O_NONBLOCK或O_NDELAY的情况下. c_cc[VTIME]和c_cc[VMIN] ...

  5. linux串口驱动分析——发送数据

    一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...

  6. linux串口驱动分析——打开设备

    串口驱动是由tty_driver架构实现的.一个应用程序中的函数要操作硬件,首先会经过tty,级级调用之后才会到达驱动之中.本文先介绍应用程序中打开设备的open函数的整个历程. 首先在串口初始化中会 ...

  7. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  8. linux串口编程总结

    串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...

  9. Chain TDNN/LSTM的拼帧索引、延时

    TDNN模型示例 TDNN拼帧: 层:(0,3) 层:(-9,0) 层:(0,3) 层:(-6,0) 层:(0,3) 层:(-3,0) 层:(0,3) 层:(-3,0)     输出依赖 帧,各层需要 ...

随机推荐

  1. HTML 入门第一课

    HTML 简单认识 HTML(HyperText Markup Language)即超文本标记语言,是一种用来制作超文本文档的简单标记语言,也是制作网页的最基本的语言,它可以直接由浏览器执行. 1.H ...

  2. Bugku - CTF加密篇之滴答~滴

    滴答~滴 答案格式KEY{xxxxxxxxx}

  3. POJ-3821-Dining (拆点网络流)

    这题为什么不能用 左边放食物,中间放牛,后面放水? 原因很简单,假设一头牛喜欢两个食物AB和两种水AB. 此时可以从一个食物A,走到牛A,再走到水A. 但是还可以有另一条路,从另一个食物B,走到该牛A ...

  4. POJ2516 Minimum Cost

    亲爱的,一个货物销售者,现在遇到了一个大问题,他需要你的帮助.在他的销售区域有 N 个店主(从 1 到 N)向他储存货物,Dearboy 有M 个供应点(从 1 到 M),每个供应点提供 K 种不同的 ...

  5. Centos5.5+LAMP环境

    Note:如果网络正常,apache服务正常,仍然不能访问网页.需要检查linux 防火墙是否关闭. ( 先重新启动防火墙 service iptables start 然后输入配置防火墙的命令并查看 ...

  6. window系统mysql安装后获取默认密码

    未设置密码,获取默认密码方法 第一步:进去mysql根目录下,如果没有data文件夹可以新建一个,找不到my.ini文件也新建一个(在根目录下创建的my.ini,重新配置的参数会覆盖源文件的参数,所以 ...

  7. spark wordcount程序

    spark wordcount程序 IllegalAccessError错误 这个错误是权限错误,错误的引用方法,比如方法中调用private,protect方法. 当然大家知道wordcount业务 ...

  8. [ DLPytorch ] 注意力机制&机器翻译

    MachineTranslation 实现过程 rstrip():删除 string 字符串末尾的指定字符(默认为空格). 语法:str.rstrip([chars]) 参数:chars -- 指定删 ...

  9. Web--TypeConverter

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. git 修改分支 删除分支 新增分支

    一.修改分支名 1.本地分支重命名 git branch -m oldName newName 2.将重命名后的分支推送到远程 git push origin newName 3.重新更新所有分支 g ...