精华内容
下载资源
问答
  • linux串口接收数据

    2010-09-05 21:56:33
    linux串口配置接收数据linux串口配置接收数据linux串口配置接收数据
  • Linux串口数据接收程序,已调试通过。
  • linux系统下,利用epoll接收串口助手发来的数据并打印。
  • linux 串口数据接收 发送实例

    热门讨论 2010-02-25 00:13:50
    此例子经过验证 不是转载 Linux 串口 数据接收 发送 <其中列举 串口 字符串和16进制数的发送和接收 以及 串口接收字符串和16进制数,解决16进制数0x0a 0x0d 0x13 0x11接收异常的问题 此例子没有线程>
  • Linux 串口接收数据

    千次阅读 2014-05-30 10:34:06
    这两天在研究Linux下的串口通信,在做接收测试的时候遇到点问题,被坑死了。

    这两天在研究Linux下的串口通信,在做接收测试的时候遇到点问题:“每次接收都必须等接收到换行符号才能read到数据”。

    后来发现其实是因为我在printf的时候只有输出\n的时候才会刷新输出设备缓存(stdout),所以就呈现了上面的效果。换用write就行。

    下面是代码,敬以此文祭奠一下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
    #include <time.h>
    #include <termios.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
    
    
    int main()
    {
     int fd;
     struct termios st;
     char ch;
     if((fd=open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK))<0){
      printf("open failed\n");
      exit(1);
     }
     st.c_iflag = 0;
     st.c_oflag = 0;
     st.c_cflag = 0;CS8|CREAD|CLOCAL;
     cfsetospeed(&st, B115200);
     cfsetispeed(&st, B115200);
     tcsetattr(fd, TCSANOW, &st);
     for(;;){
      if(read(fd,&ch,1)>0){
       write(STDOUT_FILENO,&ch,1);
       // 或者用printf("%c\n",ch)
      }
     }
    }


    展开全文
  • 此次调试环境实在两个平台下,负责发送串口数据一方是VxWorks平台,负责接收的一方是arm+Linux平台,发送的是一些必要的时间和其他信息,以下简称VxWorks和LinuxLinux接收串口数据偶尔出现接收不全的情况,...

    1、引言

        最近在Linux下调试串口程序,遇到了串口数据接收不全的异常问题,经过将近一上午的努力终于找到问题根源,特此分享给大家,此次调试过程中用到了主要用到了minicom工具,至于minicom的使用大家可以自行查找相关资料。

    2、正文

        此次调试环境实在两个平台下,负责发送串口数据一方是VxWorks平台,负责接收的一方是arm+Linux平台,发送的是一些必要的时间和其他信息,以下简称VxWorks和Linux 在Linux下接收串口数据偶尔出现接收不全的情况,具体分析过程如下:

    1、通过在VxWorks发送和Linux接收的地方分别添加打印,并且中控发送有问题的固定数据,从一个异常问题变为必现的问 题。

    2、VxWorks平台继续发送有问题数据,并且通过Linux工具的minicom工具(使用方法自行查阅)进行接收串口数据,查看数据是 否异常,经过分析发现通过minicom接收的数据同样也有问题,排除程序的逻辑问题,怀疑可能是串口设置属性问题。

    3、研究丢失的字节数据找到相关规律,发现每次丢失数据都是ox13 即19  因为VxWorks给Linux同步的时间中日期正好是6月19号,此问题也在这一天必现,并且继续测试发现0x11数据同样也存在这种问题,目前基本确定是这几个数据的问题。

    3、问题解决

    
     
    1. struct termios options;

    2. tcgetattr( g_iSonarComFd,&options);

    3. // 屏蔽 0x0d 0x11 0x13 这些特殊字符 解决这些特殊字符收不到的问题

    4. options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

    5. tcsetattr(g_iSonarComFd,TCSANOW,&options)

    4、总结

    此次问题解决主要依赖于工具和运气,因为正好赶在当天的日期中含有特殊字符,总结此问题和大家分享

    展开全文
  • linux系统下串口数据接收一帧,采用select接收,超时检测,为保证准确性发送间隔必须大于20ms(数据量越大间隔必须越大),实测没发现问题,如发现问题欢迎交流指正
  • 基于Linux平台的串口数据接收源程序,可以直接在Linxu平台下进行功能测试。
  • linux串口接收数据不完整拆包情况解决方案 去年在使用linux串口的时候,出现大于8个字节数据接收时自动拆成每个包8个字节的情况,当时处理方案是判断串口的首位字符判断接收完成。后来在使用qt做串口时收到启发,...

    linux串口接收数据不完整拆包情况解决方案

    去年在使用linux串口的时候,出现大于8个字节数据接收时自动拆成每个包8个字节的情况,当时处理方案是判断串口的首位字符判断接收完成。后来在使用qt做串口时收到启发,如果刚接收到串口有数据的信号量时,立即触发槽函数,就会出现数据不完整情况,原因是程序一检测到缓存区有数据便触发信号量,此时立刻读缓存区,数据还没有接收完,就会出现拆包情况。
    解决方案很简单,在select()后面加上一点延时即可。

    void uart_recv(int fd)
    {
        char data[1024];
        int len=0, ret = 0;
        fd_set fs_read;
        struct timeval tv_timeout;
    
        FD_ZERO(&fs_read);
        FD_SET(fd, &fs_read);
        tv_timeout.tv_sec  = 6000;//(10*20/115200+2);
        tv_timeout.tv_usec = 0;
    
        while (1)
        {
            ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout);
            usleep(10000);
            printf("ret = %d\n", ret);
            if (FD_ISSET(fd, &fs_read)) {
                memset(data,0,sizeof(data));
                len = read(fd, data, sizeof(data));
                printf("len: %d(bytes) recv: %s\n", len, data);
            } else {
                perror("select");
            }
        }
    }
    
    展开全文
  • Linux 串口接收不定长数据,网上查找好久都没有找到能用的资源,就自己写了个(ARM能正常使用),最大2K缓冲,接收文件时大于1K写一次缓冲,防止读写次数过多对flash损害。
  • Linux接收串口数据0x0d变0X0a问题

    千次阅读 2016-07-23 16:43:13
    许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。不用说也知道,这几个肯定是特殊字符...
    许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。不用说也知道,这几个肯定是特殊字符,被用作特殊控制了。关掉ICRNL和IXON选项即可解决。
    
           c_iflag &= ~(ICRNL | IXON);
    
        0x0d 回车符CR
    
        0x11 ^Q VSTART字符
    
        0x13 ^S VSTOP字符
    
        I CRNL 将输入的CR转换为NL  
    
        IXON 使起动/停止输出控制流起作用
    
    在《UNIX环境高级编程第二版》第18章第11小节看到把终端I/O设置为原始模式(串口通讯就是终端I/O的原始模式)时输入属性设置为
    
    term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);


    tcgetattr

    tcgetattr是一个函数,成功返回零;失败返回非零,发生失败接口将设置errno错误标识。
    中文名
    tcgetattr
    头文件
    #include<termios.h>
    函数原型
    int tcgetattr(int fd, 
    返回值
    成功返回零;失败返回非零

    头文件

    编辑
    #include<termios.h>

    函数原型

    编辑
    int tcgetattr(int fd, struct termios *termios_p);

    说明

    编辑
    tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios 结构体中,该结构体一般包括如下的成员:
    tcflag_t c_iflag;
    tcflag_t c_oflag;
    tcflag_t c_cflag;
    tcflag_t c_lflag;
    cc_t c_cc[NCCS];
    其具体意义如下。
    c_iflag:输入模式标志,控制终端输入方式,具体参数如表1所示。
    表1 c_iflag参数表
    键 值
    说 明
    IGNBRK
    忽略BREAK键输入
    BRKINT
    如果设置了IGNBRK,BREAK键输入将被忽略
    IGNPAR
    忽略奇偶校验错误
    PARMRK
    标识奇偶校验错误
    INPCK
    允许输入奇偶校验
    ISTRIP
    去除字符的第8个比特
    INLCR
    将输入的NL(换行)转换成CR(回车)
    IGNCR
    忽略输入的回车
    ICRNL
    将输入的回车转化成换行(如果IGNCR未设置的情况下)
    IUCLC
    将输入的大写字符转换成小写字符(非POSIX
    IXON
    允许输出时对XON/XOFF流进行控制
    IXANY
    输入任何字符将重启停止的输出
    IXOFF
    允许输入时对XON/XOFF流进行控制
    IMAXBEL
    当输入队列满的时候开始响铃
    c_oflag:输出模式标志,控制终端输出方式,具体参数如表2所示。
    表2 c_oflag参数
    键 值
    说 明
    OPOST
    处理后输出
    OLCUC
    将输出的小写字符转换成大写字符(非POSIX
    ONLCR
    将输出的NL(换行)转换成CR(回车)及NL(换行)
    OCRNL
    将输出的CR(回车)转换成NL(换行)
    ONOCR
    第一行不输出回车符
    ONLRET
    不输出回车符
    OFILL
    发送填充字符以延迟终端输出
    OFDEL
    ASCII码的DEL作为填充字符,如果未设置该参数,填充字符为NUL
    NLDLY
    换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s)
    CRDLY
    回车延迟,取值范围为:CR0、CR1、CR2和 CR3
    TABDLY
    水平制表符输出延迟,取值范围为:TAB0、TAB1、TAB2和TAB3
    BSDLY
    空格输出延迟,可以取BS0或BS1
    VTDLY
    垂直制表符输出延迟,可以取VT0或VT1
    FFDLY
    换页延迟,可以取FF0或FF1
    c_cflag:控制模式标志,指定终端硬件控制信息,具体参数如表3所示。
    表3 c_cflag参数
    键 值
    说 明
    CBAUD
    波特率(4+1位)(非POSIX
    CBAUDEX
    附加波特率(1位)(非POSIX)
    字符长度,取值范围为CS5、CS6、CS7或CS8
    CSTOPB
    设置两个停止位
    CREAD
    使用接收器
    PARENB
    PARODD
    对输入使用奇偶校验,对输出使用偶校验
    HUPCL
    关闭设备时挂起
    CLOCAL
    忽略调制解调器线路状态
    CRTSCTS
    使用RTS/CTS流控制
    c_lflag:本地模式标志,控制终端编辑功能,具体参数如表4所示。
    表4 c_lflag参数
    键 值
    说 明
    ISIG
    当输入INTR、QUIT、SUSP或DSUSP时,产生相应的信号
    ICANON
    使用标准输入模式
    XCASE
    在ICANON和XCASE同时设置的情况下,终端只使用大写。
    ECHO
    显示输入字符
    ECHOE
    如果ICANON同时设置,ERASE将删除输入的字符
    ECHOK
    如果ICANON同时设置,KILL将删除当前行
    ECHONL
    如果ICANON同时设置,即使ECHO没有设置依然显示换行符
    ECHOPRT
    如果ECHO和ICANON同时设置,将删除打印出的字符(非POSIX
    TOSTOP
    向后台输出发送SIGTTOU信号
    c_cc[NCCS]:控制字符,用于保存终端驱动程序中的特殊字符,如输入结束符等。c_cc中定义了如表5所示的控制字符。
    表5 c_cc支持的控制字符
    说 明
    说 明
    VINTR
    Interrupt字符
    VEOL
    附加的End-of-file字符
    VQUIT
    Quit字符
    非规范模式读取时的超时时间
    VERASE
    Erase字符
    VSTOP
    Stop字符
    VKILL
    Kill字符
    VSTART
    Start字符
    VEOF
    End-of-file字符
    VSUSP
    Suspend字符
    VMIN
    非规范模式读取时的最小字符数
       
    tcsetattr函数用于设置终端的相关参数。参数fd为打开的终端文件描述符,参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数。
    optional_actions可以取如下的值:
    TCSANOW:不等数据传输完毕就立即改变属性。
    TCSADRAIN:等待所有数据传输结束才改变属性。
    TCSAFLUSH:清空输入输出缓冲区才改变属性。
    错误信息:
    EBADF:非法的文件描述符
    EINTR:tcsetattr函数调用被信号中断。
    EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值。
    ENCTTY:非终端的文件描述符。
    展开全文
  • Linux系统串口接收数据编程

    千次阅读 2017-03-21 20:41:17
    之前基于IBM deveplopworks社区的代码,做了串口初始化和发送的程序,今天在此基础上添加了读取串口数据的程序。首先是最简单的循环读取程序,第二个是通过软中断方式,使用信号signal机制读取串口,这里需要注意的...
  • Linux读取串口数据

    万次阅读 2017-06-05 08:16:35
    最近项目中需要在Linux系统下读取串口数据,由于使用的Ubantu系统,开发工具是Qt Creator,所以首先在网上百度了一下,找到了几篇博客,大致内容上都差不多。由于使用的Qt4,其没有自带的串口类(Qt5就自带了串口类...
  • 网上大多数说的都是轮询的方式来读写串口数据的,但我想用中断来实现串口的数据接收。 请问各位大侠怎样在linux下获取串口中断的标志,并跳转到相关的中断服务程序执行相关指令。(使用C语言) 网上使用的 signal ...
  • Linux下实现串口接收GPS数据

    千次阅读 2019-08-13 12:35:24
    最近在做Linux下的串口接收并处理GPS数据,那对于是新手的我来说,就将这个项目分成两步,第一,接收数据,第二,处理数据。本文注重第二步的代码实现,第一步只会简单提及。本文使用的嵌入式开发板龙芯智龙1C,GPS...
  • RTLinux环境下串口数据接收与发 RTLinux环境下串口数据接收与发
  • 最近一段时间在搞Linux 跟stm32单片机的485通信,Linux系统所在的板上将发送及接收数据引脚接到485芯片上,从而完成RS232到RS485信号的转换。 理论上这种485通信是没什么问题,实际上用PC的串口助手调试Linux485的...
  • linux c++串口数据解码 ros

    千次阅读 2020-12-19 18:33:51
    Linux串口编程主要流程 :1、open打开串口设备,获取串口设备文件描述符(Linux一切都是文件)-->2、设置set波特率,初始化ini等-->3、对数据解码-->4、read()、write()操作文件描述符进行串口通信 在...
  • 1. 下载jpnevulator文件,解压,并进入文件夹 ... 2. linux下载jpnevulator sudo apt install jpnevulator ...注意这时候原先接收数据的设备就被取代了 $ jpnevulator --ascii --timing-print --tty /dev/t
  • Linux串口发送数据一段数据后发送不出去(可以正常接收),在PC调试时一切正常,但是连接到别的板子上做数据透传时出现了这样的问题 解决办法:在串口初始化和波特率设置时将options结构体memset为0,但是不清楚...
  • 近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一;另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二。 由于问题莫名其妙,以为是...
  • Android层接收串口数据

    千次阅读 2015-04-12 21:39:02
    因此,要想从串口中获取数据,需要编写Linux层驱动,并用JNI封装函数,为上层程序做为调用。 具体步骤: 1.编写Linux串口驱动。 C语言,打开串口,设置波特率,校验位,停止位,读写数据等 2.若是Windows平台下...
  • 串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。...它的全名是”数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”该标准规定采用一个 2
  • 记一次linux串口数据丢包解决过程

    千次阅读 2018-11-12 16:11:26
    首先串口数据有两种情况(明显排除发送端发送的数据不对),第一种是信道也就是串口线或者连接口不行,无法承受很高的波特率(我使用的波特率是921600),第二种就是接收端由于某种原因丢数据。通过观察我排除了第...
  • js接收串口数据

    千次阅读 2015-08-18 18:23:22
    JavaScript串口测试&lt;/title&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=GB2312" /&gt;&lt;SCRIPT ID=clientEventHandlersJS LANGUAG
  • linux串口接收不到0x11解决 网上许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,278
精华内容 6,511
关键字:

linux接收串口数据

linux 订阅