嵌入式Linux串口通讯测试问题:
  经过实验,从Linux(PC)通过串口向嵌入式Linux开发板发送数据时,串口初始化完毕后遇到回车(0x0d)或换行(0x0a)才开始从串口接收数据,回车或换行前的数据接收不到,回车或换行后的数据接收正常.从嵌入式Linux开发板通过串口向Linux(PC)发送数据,接收正常.无丢字符现象.请问这是为什么?两台Linux(PC)经过串口通讯接收正常.
-----------------------------
应该是你初始化不完整造成的.不知道你是直接端口操作还是访问的 ttySX来完成的.
-----------------------------
=============================================================================
http://bbs.linuxpk.com/thread-33570-1-1.html
我现在编写了一个linux串口接收程序,接收时必须在发送信息的后面附带一个回车符,要不然它只会存在接受缓存中而不接收,我上网搜了,说是什么行缓冲的问题,但是不知道怎么去解决啊!
------------------------------------
在linux串口中,默认的模式下只有但backspace按下的时候,才可以把缓冲区的数据提交给进程,linux提供了一个接口可以改变串口的这种默认的行为,详细信息可以查看 man termios
============================================================================
http://www.lslnet.com/linux/dosc1/06/linux-137429.htm(注:这个程序就是我用的一个能够实现接收串口数据的程序,其中把信息分开接收是因为设置的最少接收的字节数的问题,可以设置成大一些的数据)
现在想用串口接收数据,找了一个串口程序,前一段用的每问题。现在发现了一个问题,各位高手帮忙看一下如何解决?
    接受程序是这样的:(之前的初始化就不写了,肯定没问题)
                     char buff[512];
                   while((nread = read(fd,buff,10))>0)//fd是端口文件
                   {
                              printf("Len %d\n",nread);
                              buff[nread]='\0';
                              printf("%s\n",buff);
                    }
     我把两台机器串口连起来,一台linux运行这个程序。另一台winxp运行串口助手先前者发数据。比如发
两次“This is a test message!”这个字符串,[b]发现linux端没有任何显示[/b]。这时,我在winxp的字符串后加一个回车符再发一次,linux就接受到了,而且之前发的数据也打印数来了,如下
len=10
This is a 
len=10
test messa
len=10
ge!This is
len=10
a test me
len=10
ssage!This
len=10
is a test
len=10
message!

len=1

(最后这应该是回车符)
     我的理解是串口发的数据linux已经都受到了,都放在缓冲区里了,但是必须出现一个结束符read函数才能从缓冲区里读出数据来,所以最后加上回车符发送消息后,之前发的也显示出来了,不知道这么理解对不对。

但是,我现在是想只要winxp端发来数据,linux端就显示出来,而不必等待结束符。我想了好久也没有头绪,对缓冲区这里得知识不太了解。希望各位高手帮帮忙,要怎样解决这个问题?

----------------------------------------------
可以设置成不缓存的吧,google下
----------------------------------------------
怎么设呢?
是用setbuf吗?
setbuf(stdin,NULL);
我用这个不管用
----------------------------------------
你现在处理的是串口fd,你把stdin setbuf肯定不行了
-----------------------------------------
这有个例子,先看看
http://astronomy.swin.edu.au/~pbourke/other/serial/tru64.c
还有个编程向导也可以看看
http://digilander.libero.it/robang/rubrica/serial.htm
==============================================================================
http://topic.csdn.net/u/20090730/15/9f78d601-8456-4071-9512-d218b7f229a9.html
我的程序是跑在linux下的串口通讯程序,通讯一方是我的LINUX程序,另一方是个单片机. 
  他给我发送数据的时候现在我必须让他在数据的末尾再另加发一个回车的ASIC码我才能收到,否则收不到,这是怎么回事情啊?
-----------------------
设计用回车做发送标志吧。
-----------------------
检查一下 单片机程序,是不是有缓冲机制?
-------------------------
查了查资料,好象是说需要设置为原始模式.可究竟怎么设置为原始模式,总也没个统一的说法.高手们谁有这方面经验啊?
-------------------------
首先要有一个协议,如果协议里没有回车就不用了,直接进行收发,还有就是可以的话在协议里增加一个报文长度,这样也很好判断结束. 
想想也不对呀,怎么会让对方加结束符你才能收到,你是怎么判断一帧数据结束的?查检一下
-------------------------
while(1) 
  { 
      nread = read(fd, buff, 127); 
  while((nread>0)) 
  { 
      buff[nread]='\0'; 
      printf("%s",buff); 
            nread = 0; 
  } 
  } 
}

这个是我的读串口程序,我没加任何判断,只要读到了就显示.可如果对方不发送回车我这边就怎么也显示不出来.无论对方之前发了多少东西,只要最后发个回车,前面发的就会全部显示出来.

---------------------------------
设置原始通信模式,串口不对接收到的数据进行处理而直接返回 
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
options.c_oflag &= ~OPOST;
---------------------------------
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
options.c_oflag &= ~OPOST; 
接受程序设置了,还是那样.

应该不是发送方的问题.因为我用另外一个linux系统发送也是这样,发送完了必须发送个回车. 
这边才接到.

----------------------------------
设置原始模式可以通过cfmakeraw函数,同时可以添加超时和读取最小字符的设置。
======================================================================
http://topic.csdn.net/u/20071010/12/1f584805-f8f0-44f4-b6af-130401152ceb.html
在linux与windows间进行简单的串行数据的发送接收操作.linux下的程序源码如下,windows用使用串口调试程序收发数据.结果linux发往windows的数据能正常接收,但windows发往linux的数据linux方却无法接收,最奇怪的事是: windows发送的数据windows自己却收到了(linux没有转发收到的数据,串口线的2,3脚也没有短接;在windows上开两个串口调试程序,在COM1,COM2间发送数据进行试验,一切正常)!!请高人指点迷津. 
#include <stdio.h> /* Standard input/output definitions */ 
#include <string.h> /* String function definitions */ 
#include <unistd.h> /* UNIX standard function definitions */ 
#include <fcntl.h> /* File control definitions */ 
#include <errno.h> /* Error number definitions */ 
#include <termios.h> /* POSIX terminal control definitions */ 
#include <signal.h> 
#include <sys/types.h> 
#include <sys/time.h> 
#include <sys/select.h> 
int main(void) 

int recnum,fd; 
char buf[1024]; 
recnum=0; 
recnumb=0; 
fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK) 
if(fd==-1) 

perror("failed to open com1:"); 
return 0; 

ia=write(fd,"the data come from linux!",25); 
if(ia <0) 

fputs("failed to write data to com1!\n",stderr); 
return 0; 

while(1) 

recnum=read(fd,buf,255); 
if(recnum>0) 
break; 

printf("%s\n",buf); 
close(fd); 
return 0; 
}

--------------------------

你用串口调试助手发送数据的时候加个“回车”,linux下就能收到了,是什么原因,我也不清楚,反正我以前用串口发数据的时候就是这样,正奇怪着呢,就搞别的去了,这个问题一直没有解决。
--------------------------
非常感谢楼上的,加个"回车"确实能够收到了,但很奇怪linux在收到的时候还是会给windows回发数据,我觉得可能是串口驱动的问题,我想把问题解决应该不难,甚至自己写个驱动,但现在的问题是不知道驱动放在哪里了。另外在setserial里有divisor选择驱动,默认是0,能改变这个吗?
---------------------------
默认文件是行缓冲的,没回车当然收不到 
要进行终端特性设置的,好好看看termio
---------------------------
谢谢指教,现在比较急,我在看termio.h这个文件,是不是定义这个结构体的时候需要设置,或者终端特性设置指什么?
---------------------------
终端设置就是指定义termio这个结构体吧,还有个问题,为什么windows给linux发串口信息,会自动返回信息呢?也是和终端设置有关系吗?还是驱动?
--------------------------
我好好看了下termio,受益非浅,确实是里面的设置问题,谢谢,问题已解决,准备结贴。
======================================================================
常用设置

9.1设置规范模式

规范模式是面向行的输入方式,输入字符被放入用于和用户交互可以编辑的缓冲区内,直接到读入回车或者换行符号时才结束。

可以通过如下方式来设置

option.c_lflag |= (ICANON | ECHO | ECHOE);

9.2设置原始输入模式

原始输入模式是没有处理过的,当接收数据时,输入的字符在它们被接收后立即被传送,使用原始输入模式时候,一般可以选择取消ICANON,ECHO,ECHOE和ISIG选项。

例如:

option.c_lflag &= ~(ICANON | ECHO | ECHOE);

=========================================================================

总结:上面的问题应该比较清楚了,就是在输入模式的设置上出了问题,默认的可能是行缓冲的,导致在接收串口的时候,串口会自行把数据存到缓冲里面,只有接收到回车、换行等结束标志后,才把数据一起送到内存,这样串口的read函数才能读到数据,也就会触发相应的标志(SIGIO)。所以,需要在对串口设置的时候,要设置为原始输入模式。

关于嵌入式linux下的串口通讯问题---回车、换行、缓冲相关推荐

  1. linux 串口 换行十六制,关于嵌入式linux下的串口通讯问题---需增加回车/换行才能接收...

    问题:在Linux应用层,直接从/dev/tty***使用read()函数读数据,无法读到,只有在数据末尾加上0a/0d才可以读到数据(这里是发送十六进制的数据,ASCLL码同理,增加回车才可以读到数 ...

  2. linux下实现串口通讯

    1.关键结构体 (1)struct termios                 { unsigned short c_iflag;             /* 输入模式标志*/          ...

  3. C——Linux下的串口编程

    原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...

  4. gsm基于linux程序,基于嵌入式Linux下GSM模块的短信收发系统设计

    摘要:移动通信中的短消息业务以其方便.可靠和价廉得到了广泛应用,本文在嵌入式Linux系统中,通过西门子MC35模块,实现了短信收发系统,该系统采用PDU短信模式,能支持中文短信.程序设计采用异步事件 ...

  5. linux 测试串口命令,Linux 下测试串口的命令microcom

    昨天应为要测试主板上的串口,查了一下,可以使用microcom 这条命令进行测试. 命令使用方法很简单: Usage: microcom [-d DELAY] [-t TIMEOUT] [-s SPE ...

  6. STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序

    1.其里面的的通信协议是是自己定的,这里 是检测到数据的结尾是以0x0d.0x0a结尾,则表示接受的数据完成了,这个数据是我想要的,这样子就不会出现一些错乱的数据信息.其中的0x8000.0x4000 ...

  7. 嵌入式linux与pc串口传输文件基于lrzsz

    嵌入式linux与pc串口传输文件基于lrzsz 嵌入式linux传输应用程序通常用nfs.tftp等比较麻烦,一般小应用也就几k用串口就行,这里给出一种串口传输文件的方式lrzsz lzsz需要在开 ...

  8. 嵌入式linux学习笔记--TCP通讯整理

    嵌入式linux学习笔记–TCP通讯整理 之前的项目中使用到了比较多的tcp 通讯相关的知识,一直也没有进行整理,今天准备拿出时间好好的整理一下TCP通讯的整个过程.预计会整理linux和window ...

  9. 嵌入式linux进行视频监控,嵌入式Linux下的视频监控解决方案

    原标题:嵌入式Linux下的视频监控解决方案 在嵌入式工控板上接一个摄像头进行视频监控,看起来比较容易实现,但往往是"理想很丰满.现实很骨感".历经千辛万苦效果却不是很理想,本文就 ...

最新文章

  1. iOS中UIDynamic物理仿真详解
  2. 微软研究院开源DialoGPT:你有什么梦想?「让世界充满机器人」
  3. VIP群第一期讲座实屏片段摘录
  4. python精彩编程200例百度_Python趣味编程与精彩实例
  5. 数据结构:线性数据结构(2)-队列(栈,队列,deques, 列表)
  6. Mac OS使用技巧十九:Safari碉堡功能之二查看网页源码
  7. hdu5461-Largest Point(贪心)
  8. springMVC接收数组参数
  9. 判别式模型和生成式模型的区别(discriminative model and generative model)
  10. HTTP和HTTPS有什么区别? 什么是SSL证书?使用ssl证书优势?
  11. 机器学习、神经网络、深度学习区别
  12. 如何使用计算机内设照相机,win7系统打开照相机功能的操作方法
  13. 【论文笔记】Neural Relation Extraction with Multi-lingual Attention
  14. java 农历_java怎么取得农历的节日
  15. APS高级排程在钣金冲压行业的应用
  16. 中止执行后超过2年_执行中止。债权人是否两年内都要申请执行一次。如果中止执行两年内不申请执行,是否都再也执行不了...
  17. RBP系统管理之日志管理
  18. 【Python】PyQt5.QtWidgets模块常用函数和类(使用参考源码)
  19. 华为云服务-运维篇-弹性负载均衡
  20. Android 按关键字或文件后缀搜索文件

热门文章

  1. 正态分布(用python画出相应的图)
  2. 怎么将EXCEL转换为财务软件导入需要的XML格式,干货到,EXCEL如何转换为财务软件导入数据所需格式
  3. 开发和常用工具推荐清单
  4. 每周一品 · 直线电机(Linear Motor)中的磁性材料
  5. SQL Server Arithmetic overflow error converting nvarchar to data type numeric
  6. 网站php挂马从哪里挂的,寻找PHP(网站)挂马,后门
  7. 菜鸟好文推荐(九)——程序员”青春饭”问题之我见
  8. Android开发:开源库集合
  9. DP(最长上升子序列)——腾讯校招题:逛街
  10. 小x与三角形 c语言 1秒,[2019年第一水] 小x与神牛