-
2021-05-14 01:14:02
最近一个项目使用了嵌入式linxu串口通信,由于通信使用的是2进制数据,经常出现通信校验失败,数据帧大小没问题,就是校验出错
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)
CSIZE
字符长度,取值范围为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字符
VTIME
非规范模式读取时的超时时间
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:非终端的文件描述符。
更多相关内容 -
为什么当我重启电脑时会出现数据丢失?
2021-02-07 12:48:50并口、串口、USB接口接入有故障或不兼容的外部设备时自动重启 ①外设有故障或不兼容,比如打印机的并口损坏,某一脚对地短路,USB设备损坏对地短路,针脚定义、信号电平不兼容等等。 ②热插拔外部设备时,抖动过大...展开全部
大概是内存的问题!但是还是给你提供一些详细的资料!希望能帮助到你! 一、32313133353236313431303231363533e4b893e5b19e31333332626666软件方面
1.病毒
"冲击波"病毒发作时还会提示系统将在60秒后自动启动。
木马程序从远程控制你计算机的一切活动,包括让你的计算机重新启动。
解决方法:清除病毒,木马,或重装系统。
2.系统文件损坏
系统文件被破坏,如Win2K下的KERNEL32.DLL,Win98 FONTS目录下面的字体等系统运行时基本的文件被破坏,系统在启动时会因此无法完成初始化而强迫重新启动。
解决方法:覆盖安装或重新安装。
3.定时软件或计划任务软件起作用
如果你在"计划任务栏"里设置了重新启动或加载某些工作程序时,当定时时刻到来时,计算机也会再次启动。对于这种情况,我们可以打开"启动"项,检查里面有没有自己不熟悉的执行文件或其他定时工作程序,将其屏蔽后再开机检查。当然,我们也可以在"运行"里面直接输入"Msconfig"命令选择启动项。
二、硬件方面
1.机箱电源功率不足、直流输出不纯、动态反应迟钝。
用户或装机商往往不重视电源,采用价格便宜的电源,因此是引起系统自动重启的最大嫌疑之一。
①电源输出功率不足,当运行大型的3D游戏等占用CPU资源较大的软件时,CPU需要大功率供电时,电源功率不够而超载引起电源保护,停止输出。电源停止输出后,负载减轻,此时电源再次启动。由于保护/恢复的时间很短,所以给我们的表现就是主机自动重启。
②电源直流输出不纯,数字电路要求纯直流供电,当电源的直流输出中谐波含量过大,就会导致数字电路工作出错,表现是经常性的死机或重启。
③CPU的工作负载是动态的,对电流的要求也是动态的,而且要求动态反应速度迅速。有些品质差的电源动态反应时间长,也会导致经常性的死机或重启。
④更新设备(高端显卡/大硬盘/视频卡),增加设备(刻录机/硬盘)后,功率超出原配电源的额定输出功率,就会导致经常性的死机或重启。
解决方法:现换高质量大功率计算机电源。
2.内存热稳定性不良、芯片损坏或者设置错误
内存出现问题导致系统重启致系统重启的几率相对较大。
①内存热稳定性不良,开机可以正常工作,当内存温度升高到一定温度,就不能正常工作,导致死机或重启。
②内存芯片轻微损坏时,开机可以通过自检(设置快速启动不全面检测内存),也可以进入正常的桌面进行正常操作,当运行一些I/O吞吐量大的软件(媒体播放、游戏、平面/3D绘图)时就会重启或死机。
解决办法:更换内存。
③把内存的CAS值设置得太小也会导致内存不稳定,造成系统自动重启。一般最好采用BIOS的缺省设置,不要自己改动。
3.CPU的温度过高或者缓存损坏
①CPU温度过高常常会引起保护性自动重启。温度过高的原因基本是由于机箱、CPU散热不良,CPU散热不良的原因有:散热器的材质导热率低,散热器与CPU接触面之间有异物(多为质保帖),风扇转速低,风扇和散热器积尘太多等等。还有P2/P3主板CPU下面的测温探头损坏或P4 CPU内部的测温电路损坏,主板上的BIOS有BUG在某一特殊条件下测温不准,CMOS中设置的CPU保护温度过低等等也会引起保护性重启。
②CPU内部的一、二级缓存损坏是CPU常见的故障。损坏程度轻的,还是可以启动,可以进入正常的桌面进行正常操作,当运行一些I/O吞吐量大的软件(媒体播放、游戏、平面/3D绘图)时就会重启或死机。
解决办法:在CMOS中屏蔽二级缓存(L2)或一级缓存(L1),或更换CPU排除。
4.AGP显卡、PCI卡(网卡、猫)引起的自动重启
①外接卡做工不标准或品质不良,引发AGP/PCI总线的RESET信号误动作导致系统重启。
②还有显卡、网卡松动引起系统重启的事例。
5. 并口、串口、USB接口接入有故障或不兼容的外部设备时自动重启
①外设有故障或不兼容,比如打印机的并口损坏,某一脚对地短路,USB设备损坏对地短路,针脚定义、信号电平不兼容等等。
②热插拔外部设备时,抖动过大,引起信号或电源瞬间短路。
6.光驱内部电路或芯片损坏
光驱损坏,大部分表现是不能读盘/刻盘。也有因为内部电路或芯片损坏导致主机在工作过程中突然重启。光驱本身的设计不良,FireWare有Bug。也会在读取光盘时引起重启。
7.机箱前面板RESET开关问题
机箱前面板RESET键实际是一个常开开关,主板上的RESET信号是+5V电平信号,连接到RESET开关。当开关闭合的瞬间,+5V电平对地导通,信号电平降为0V,触发系统复位重启,RESET开关回到常开位置,此时RESET信号恢复到+5V电平。如果RESET键损坏,开关始终处于闭合位置,RESET信号一直是0V,系统就无法加电自检。当RESET开关弹性减弱,按钮按下去不易弹起时,就会出现开关稍有振动就易于闭合。从而导致系统复位重启。
解决办法:更换RESET开关。
还有机箱内的RESET开关引线短路,导致主机自动重启。
8. 主板故障
主板导致自动重启的事例很少见。一般是与RESET相关的电路有故障;插座、插槽有虚焊,接触不良;个别芯片、电容等元件损害。
三、其他原因
1.市电电压不稳
①计算机的开关电源工作电压范围一般为170V-240V,当市电电压低于170V时,计算机就会自动重启或关机。
解决方法:加稳压器(不是UPS)或130-260V的宽幅开关电源。
②电脑和空调、冰箱等大功耗电器共用一个插线板的话,在这些电器启动的时候,供给电脑的电压就会受到很大的影响,往往就表现为系统重启。
解决办法就是把他们的供电线路分开。
2.强磁干扰
不要小看电磁干扰,许多时候我们的电脑死机和重启也是因为干扰造成的,这些干扰既有来自机箱内部CPU风扇、机箱风扇、显卡风扇、显卡、主板、硬盘的干扰,也有来自外部的动力线,变频空调甚至汽车等大型设备的干扰。如果我们主机的搞干扰性能差或屏蔽不良,就会出现主机意外重启或频繁死机的现象。
3、交流供电线路接错
有的用户把供电线的零线直接接地(不走电度表的零线),导致自动重启,原因是从地线引入干扰信号。
4.插排或电源插座的质量差,接触不良。
电源插座在使用一段时间后,簧片的弹性慢慢丧失,导致插头和簧片之间接触不良、电阻不断变化,电流随之起伏,系统自然会很不稳定,一旦电流达不到系统运行的最低要求,电脑就重启了。解决办法,购买质量过关的好插座。
5. 积尘太多导致主板RESET线路短路引起自动重启。
四、部分实例
1. CPU二级缓存坏的实例
一台几年前配置的兼容机:K6-2 200MHz CPU,采用VX-Pro+芯片组的主板,两根16MB 72线EDO内存,
Windows 98操作系统。在出现蓝天白云画面后自动重启,安全模式同样无法进入,只能进入MS-DOS模式。笔者猜想由于内存条质量问题导致电脑重启的可能性较大,所以首先更换同型号内存条测试,故障依旧。再更换电源仍无法解决问题。排除到最后只剩下主板、CPU和显卡,试过显卡没有问题后,苦于找不到能安装K6-2 200MHz CPU的旧主板只能作罢。
当时也怀疑过BIOS设置可能有误,试过恢复到缺省值,也未能解决问题。过了几天,再次摆弄电脑时,无意进入BIOS并将CPU Internal Cache一项设为Disable,保存退出后重启,系统竟然可以启动了!由此估计应当是CPU的缓存有问题,于是再将缓存设置为打开状态并启动电脑,果然系统又不能正常启动了。由于将缓存关闭后大幅度降低了CPU的性能,所以Windows 98在启动和运行程序时比以往慢了许多,最后换了一块CPU才算解决问题
2. 电源故障的实例
笔者上班的地方计算机每天都要开着(因为上网的人多),十天半月不关机是常事。在如此高的工作强度下,硬件设备的故障率也很高。
故障现象:两台兼容机,一台CPU为Athlon XP 1700+,一台CPU为P4 1.7GHz,主机电源均为世纪之星电源。当计算机处于满负荷状态运行一段时间后(此时CPU使用率保持在100%,硬盘也在大量读写数据),经常性地自动重启。其中一台在挂接一块60GB硬盘和一块80GB硬盘时,出现供电不足的现象。
故障分析处理:由于这两台计算机平时用于文档编辑、上网等一般工作时正常,只有进行大量计算时才出问题。开始怀疑是CPU温度过高所致,但检测表明温度正常。检查硬盘发现,其中一块硬盘出现了坏道,但是在更换硬盘重装系统后故障依旧,看来硬盘出现坏道很可能是计算机经常非正常重启导致的。在更换新电源后,故障消失。
拆开两个旧电源,发现其中一个电源的两个相同型号的电解电容(3300μF/10V)顶端有黄褐色的颗粒状凝结物,另一个电源的两个不同型号的电解电容(1000μF/16V,3300μF/16V)顶端也有黄褐色的颗粒状凝结物,这是电容被击穿漏液所导致的。在电子市场花钱购买了相同型号的电容更换后,经测试均恢复正常。这里提醒一下,千万别把电容正负极接反了! 事后分析发现,笔者单位电网常因检修或用电不当突然停电,导致配件上的电容被击穿,一块主板也曾经在一次突然停电后罢工,检查发现几个大电解电容被击穿漏液,更换电容后恢复正常。
3. 显卡接触不良的实例
故障现象:朋友电脑配置为明基BenQ 77G的显示器、技嘉8IRX的主板、P4 1.6G CPU、80G硬盘、小影霸速配3000显卡、全向极云飞瀑内猫、主板自带AC97的声卡。因装修房子,要挪动电脑,就把电脑后的连线都拆了。后来自己接好线后,电脑却怎么也启动不起来了。电脑自检正常,闪过主板LOGO后,出现WINDOWS 98启动画面,接着光标闪动,一切很正常,可是约摸着快要进入系统的时候,电脑突然"嘀"的一声重启动了,重新启动几次都是这样。
故障分析:笔者的这位朋友是个纯纯的"菜鸟",初步判断可能是一般性的接线问题,很有可能是鼠标和键盘接反导致的。先是检查了一遍电脑接线,没有问题,会不会是接线松动呢?重新把所有电脑连线接了一遍
故障依旧。启动时选安全模式能进入系统,运行也正常,重启后进入BIOS里查看CPU温度,在正常范围内,排除因CPU过热导致的重启。朋友也没安装新的硬件,故排除电源供电不足导致重启现象。引起故障的原因可能有以
下四个方面:一是软件冲突;二是显示分辨率或刷新率设置高于额定的值;三是显卡和其它硬件冲突、或驱动程序问题导致;四是显卡故障。
故障排除:问朋友发生故障前对机器进行了哪些操作?朋友说拆机前一直都用的很好,没有安装过新软件。没有蛛丝马迹,只有从上面的四个可能的故障原因里排查。重启后,进入安全模式,运行msconfig命令,把启动项里不是操作系统所必需的项都去掉,重启后,故障依旧。看来不是软件安装导致的。接下来看看是不是分辨率和刷新率过高,在安全模式下,将监视器删除,重启动,故障依旧。最后问题都集中在显卡身上了。再次进入安全模式,删除显卡驱动程序,重启动后,跳过显卡驱动安装,能进入正常启动模式,看来故障是驱动程序的问题或显卡与其它硬件冲突引起的了。下载一个新的驱动看能不能解决这个问题呢?拨号上网,机器突然又重启了,难道猫也坏了吗?这可怎么办,真的山穷水复了吗?这台电脑是因为拆了以后就启不起来了,显卡和猫总不会因搬一下机器就坏了吧?想到搬运机器,是不是因为拆装电脑时把显卡碰松导致接触不良而引起的故障呢?抱着最后试一试的心理,打开机箱,将显卡和猫拔出重新插紧安好,装好显卡驱动,重启,竟然看到美丽的桌面了,试着拨号,也没问题了,故障排除了。原来故障是显卡接触不良的导致。
小结:以上显卡接触不良导致电脑不能进入系统故障,现象有点类似显卡故障的症状,如果不从细小问题入手,还真难一时半会解决,甚至会怀疑是硬件故障,而大费周折。
已赞过
已踩过<
你对这个回答的评价是?
评论
收起
-
电脑开机无限重启解决方法
2021-07-27 05:20:17电脑开机无限重启怎么办?下面一起来看看电脑开机无限重启解决方法。1.病毒[冲击波"病毒发作时还会提示系统将在60秒后自动启动.木马程序从远程控制你计算机的一切活动.包括让你的计算机重新启动.清除病毒.木马.或重装...电脑开机无限重启怎么办?下面一起来看看电脑开机无限重启解决方法。
1.病毒
[冲击波"病毒发作时还会提示系统将在60秒后自动启动.
木马程序从远程控制你计算机的一切活动.包括让你的计算机重新启动.
清除病毒.木马.或重装系统.
2.系统文件损坏
系统文件被破坏.如Win2K下的KERNEL32.DLL.Win98 FONTS目录下面的字体等系统运行时基本的文件被破坏.系统在启动时会因此无法完成初始化而强迫重新启动.
解决方法:覆盖安装或重新安装.
3.定时软件或计划任务软件起作用
如果你在[计划任务栏"里设置了重新启动或加载某些工作程序时.当定时时刻到来时.计算机也会再次启动.对于这种情况.我们可以打开[启动"项.检查里面有没有自己不熟悉的执行文件或其他定时工作程序.将其屏蔽后再开机检查.当然.我们也可以在[运行"里面直接输入[Msconfig"命令选择启动项.
4.机箱电源功率不足.直流输出不纯.动态反应迟钝.
用户或装机商往往不重视电源.采用价格便宜的电源.因此是引起系统自动重启的最大嫌疑之一.
①电源输出功率不足.当运行大型的3D游戏等占用CPU资源较大的软件时.CPU需要大功率供电时.电源功率不够而超载引起电源保护.停止输出.电源停止输出后.负载减轻.此时电源再次启动.由于保护/恢复的时间很短.所以给我们的表现就是主机自动重启.
②电源直流输出不纯.数字电路要求纯直流供电.当电源的直流输出中谐波含量过大.就会导致数字电路工作出错.表现是经常性的死机或重启.
③CPU的工作负载是动态的.对电流的要求也是动态的.而且要求动态反应速度迅速.有些品质差的电源动态反应时间长.也会导致经常性的死机或重启.
④更新设备(高端显卡/大硬盘/视频卡).增加设备(刻录机/硬盘)后.功率超出原配电源的额定输出功率.就会导致经常性的死机或重启.
解决方法:现换高质量大功率计算机电源.
5.内存热稳定性不良.芯片损坏或者设置错误
内存出现问题导致系统重启致系统重启的几率相对较大.
①内存热稳定性不良.开机可以正常工作.当内存温度升高到一定温度.就不能正常工作.导致死机或重启.
②内存芯片轻微损坏时.开机可以通过自检(设置快速启动不全面检测内存).也可以进入正常的桌面进行正常操作.当运行一些I/O吞吐量大的软件(媒体播放.游戏.平面/3D绘图)时就会重启或死机.
解决办法:更换内存.
③把内存的CAS值设置得太小也会导致内存不稳定.造成系统自动重启.一般最好采用BIOS的缺省设置.不要自己改动.
6.CPU的温度过高或者缓存损坏
①CPU温度过高常常会引起保护性自动重启.温度过高的原因基本是由于机箱.CPU散热不良.CPU散热不良的原因有:散热器的材质导热率低.散热器与CPU接触面之间有异物(多为质保帖).风扇转速低.风扇和散热器积尘太多等等.还有P2/P3主板CPU下面的测温探头损坏或P4 CPU内部的测温电路损坏.主板上的BIOS有BUG在某一特殊条件下测温不准.CMOS中设置的CPU保护温度过低等等也会引起保护性重启.
②CPU内部的一.二级缓存损坏是CPU常见的故障.损坏程度轻的.还是可以启动.可以进入正常的桌面进行正常操作.当运行一些I/O吞吐量大的软件(媒体播放.游戏.平面/3D绘图)时就会重启或死机.
解决办法:在CMOS中屏蔽二级缓存(L2)或一级缓存(L1).或更换CPU排除.
7.AGP显卡.PCI卡(网卡.猫)引起的自动重启
①外接卡做工不标准或品质不良.引发AGP/PCI总线的RESET信号误动作导致系统重启.
②还有显卡.网卡松动引起系统重启的事例.
8.并口.串口.USB接口接入有故障或不兼容的外部设备时自动重启
①外设有故障或不兼容.比如打印机的并口损坏.某一脚对地短路.USB设备损坏对地短路.针脚定义.信号电平不兼容等等.
②热插拔外部设备时.抖动过大.引起信号或电源瞬间短路.
9.光驱内部电路或芯片损坏
光驱损坏.大部分表现是不能读盘/刻盘.也有因为内部电路或芯片损坏导致主机在工作过程中突然重启.光驱本身的设计不良.FireWare有Bug.也会在读取光盘时引起重启.
10.机箱前面板RESET开关问题
机箱前面板RESET键实际是一个常开开关.主板上的RESET信号是 5V电平信号.连接到RESET开关.当开关闭合的瞬间. 5V电平对地导通.信号电平降为0V.触发系统复位重启.RESET开关回到常开位置.此时RESET信号恢复到 5V电平.如果RESET键损坏.开关始终处于闭合位置.RESET信号一直是0V.系统就无法加电自检.当RESET开关弹性减弱.按钮按下去不易弹起时.就会出现开关稍有振动就易于闭合.从而导致系统复位重启.
解决办法:更换RESET开关.
还有机箱内的RESET开关引线短路.导致主机自动重启.
11.主板故障
主板导致自动重启的事例很少见.一般是与RESET相关的电路有故障,插座.插槽有虚焊.接触不良,个别芯片.电容等元件损害.
-
Linux串口通信中一种接收不到数据的问题的解决
2020-12-20 23:55:46转载来源:嵌入式系统之初学者点滴 (百度空间...此时将显示写入串口成功,但是读串口数据失败。这个奇怪的问题当时之所以没有被发现出来,是因为在这之前,曾经打开过一次minicom。后来实验表明,如果打开过一次mini...转载来源:嵌入式系统之初学者点滴 (百度空间)
在这篇文章()中,实现了Linux环境下的串口读写操作,程序也运行成功了。但是再进一步测试时发现,如果开机之后直接如上文中所说,分别运行读程序和写程序,再用导体同时触碰串口的2、3针的话。此时将显示写入串口成功,但是读串口数据失败。
这个奇怪的问题当时之所以没有被发现出来,是因为在这之前,曾经打开过一次minicom。后来实验表明,如果打开过一次minicom,哪怕打开又关闭的话,再次运行上文中的串口读写程序就没有问题了。但是重启机器之后,错误又出现了:只要不运行minicom一下,程序读取总是会有问题。
为了查找错误究竟是在什么地方,分别在刚刚开机、运行过一次自己编写的串口程序、运行过一次minicom这三种情况下使用命令stty -a < /dev/ttyS0查看了COM1的相关参数。然后主要根据自己的读取程序和minicom对串口的设置差异进行了相应的修改,现将读取程序的全部贴在下面。经过修改后,该程序运行之后的/dev/ttyS0的环境参数与直接运行minicom后/dev/ttyS0的环境参数完全相同。
注:程序中红色部分是与 文中的程序相比加入的主要内容。
/*********************************** read_serial ************************************/
#include
#include
#include
#include
#include
#include
#include
#define FALSE -1
#define TRUE 0
void set_speed(int, int);
int set_Parity(int,int,int,int);
int main()
{
int fd,flag,rd_num=0;
struct termios term;
struct timeval timeout;
speed_t baud_rate_i,baud_rate_o;
char recv_buf[20];
fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK);
if(fd==-1)
printf("can not open the COM1!\n");
else
printf("open COM1 ok!\n");
flag=tcgetattr(fd,&term);
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("设置之前的输入波特率是%d,输出波特率是%d\n",baud_rate_i,baud_rate_o);
set_speed(fd,1200);
flag=tcgetattr(fd,&term);
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("设置之后的输入波特率是%d,输出波特率是%d\n",baud_rate_i,baud_rate_o);
if (set_Parity(fd,8,1,'N')== FALSE)
{
printf("Set Parity Error\n");
exit(1);
}
int transfer_started=0;
int i=0;
while(1)
{
rd_num=read(fd,recv_buf,sizeof(recv_buf));
timeout.tv_sec=0;
timeout.tv_usec=200000;
if(rd_num>0)
{
printf("%d(间隔%4.3fs):we can read \"%s\" from the COM1,total:%d characters.\n",++i,timeout.tv_sec+timeout.tv_usec*0.000001,recv_buf,rd_num);
transfer_started=1;
}
else
printf("%d(间隔%4.3fs):read fail! rd_num=%d。本次数据传输%s\n",++i,timeout.tv_sec+timeout.tv_usec*0.000001,rd_num,transfer_started==1?"已经结束":"尚未开始");
// sleep(1); 粗糙定时
select(0,NULL,NULL,NULL,&timeout);/*精确定时*/
}
}
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300};
int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300};
void set_speed(int fd, int speed){
unsigned int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; 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 != 0) {
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄*
*@param databits 类型 int 数据位 取值 为 7 或者8*
*@param stopbits 类型 int 停止位 取值为 1 或者2*
*@param parity 类型 int 效验类型 取值为N,E,O,,S
*/
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 */
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/
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')&&(parity != 'N'))
options.c_iflag |= INPCK;
options.c_cc[VTIME] = 5; // 0.5 seconds
options.c_cc[VMIN] = 1;
options.c_cflag &= ~HUPCL;
options.c_iflag &= ~INPCK;
options.c_iflag |= IGNBRK;
options.c_iflag &= ~ICRNL;
options.c_iflag &= ~IXON;
options.c_lflag &= ~IEXTEN;
options.c_lflag &= ~ECHOK;
options.c_lflag &= ~ECHOCTL;
options.c_lflag &= ~ECHOKE;
options.c_oflag &= ~ONLCR;
tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}
这样的话,读程序就可以直接接收到串口过来的数据,而不需要先运行一次minicom了。
-
STM32使用串口发送数据 复位后第一次发送的数据中第一个数据丢失之原因
2022-03-05 11:34:01使用STM32F103芯片,通过串口USART1发送数据,复位之后,第一次发送数据时,所发送的数据中第一个数据丢失,之后发送的数据正常。代码是从正点原子STM32F1例程中扒出来的,接收和发送同时使用时,是正常的,只有单独... -
stm32串口热拔插以后,接收数据出错的处理办法
2020-09-24 11:38:14最近发现,STM32中断接收完成回调函数在USB转CH340模块带电拔插一次以后会出现异常数据。 引起这个问题的原因还在排查中。 先占个位置,有空再写。 -
HAL库版DMA循环模式串口数据收发
2020-12-23 02:44:43STM32CubeMX生成的HAL库中,提供了三类串口数据收发的接口,分别为阻塞模式,非阻塞模式和DMA模式,文本主要对DMA模式进行了分析并依据提供的接口提出了更加实用的串口数据收发方案。通过对网上资料的查找和分析,... -
stm32串口发送数据复位第一个数据丢失(已解决)
2020-12-19 10:28:59否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x... -
C#串口数据读写——计数器数据获取重置功能记录
2020-07-26 11:12:29最近遇到一个计数器/计米器/光栅表串口数据读取的小case,查询借鉴修改了些资料,简单记录下实现代码。 主要思路是使用System.IO.Ports.SerialPort类 初始化SerialPort类,设置相关参数及绑定事件 AddData为根据... -
[Unity] 串口读取数据错误 IOException: 拒绝访问。
2020-08-26 12:37:31错误内容 IOException: 拒绝访问。 System.IO.Ports.WinSerialStream.ReportIOError (System.String optional_arg) (at <14e3453b740b4bd690e8d4e5a013a715>:0) System.IO.Ports.WinSerialStream…ctor ... -
VB6.0 在开发串口时遇到下位机重启或者上电,就接不到数据了
2017-03-29 03:32:19今天在开发一个APP控制串口软件,用的是MSCOMM控件,存在一个问题就是下位机上电或者重启时,APP就接不到数据了,有遇到过的吗?程序如下: Private Sub Command1_Click() On Error Resume Next '//屏蔽错误 If MSC... -
Gdb串口调试内核出现的各种错误的解决办法(转)
2021-05-16 19:32:46gdb调试内核是在target machine还没有启动起来的时候就开始调试!!!!(即target machine还没有进入系统...target machine:龙芯2Fdevelopment machine:X86错误1:(gdb) set remotebaud 9600(gdb) target remote /... -
stm32串口发送数据复位 第一个数据丢失
2020-12-29 01:40:27否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x... -
串口数据读取和动态显示Tkinter+matplotlib+pyqtgraph(详细教程)
2019-08-24 21:55:01串口数据读取和动态显示Tkinter+matplotlib+pyqtgraph(详细教程) 注意 :本函数已将pyqtgraph动态绘图隐藏,在main函数中去除隐藏便可以显示,但是没有嵌入到tkinter 运行环境: win10,python3.5.2 效果图1 ... -
服务器重启命令
2021-08-14 04:02:03服务器重启命令 内容精选换一换openEuler,EulerOS,CentOS 8.0及以上操作系统默认开启SElinux强制模式,会导致工具安装失败。若想关闭SElinux强制模式,执行以下操作。临时关闭执行以下命令查询SELinux状态。... -
NRF52832串口接收错误,进入APP_UART_COMMUNICATION_ERROR
2021-01-05 20:07:37在进行nrf52832串口与计量芯片通信时,总是遇到APP_UART_COMMUNICATION_ERROR // 接收过程中发生通信错误 然后蓝牙就死掉了。emmmmmm… 总结三种可能性: 1 发送端发送了错误的帧, 在一个错误帧出现的情况下。如果... -
ROS系统的串口数据读取和解析
2019-06-14 19:07:48一、Ubuntu下的串口助手cutecom 下载:sudo apt-get install cutecom 打开:sudo cutecom 查看电脑链接的串口信息(名称): dmesg | grep ttyS* 二、使用ROS提供的serial包实现串口通信 ... -
stm32串口发送数据,丢失字节问题分析
2020-12-29 18:54:10STM32 串口 发送 必须 先检测 状态,否则 第一个 字节 无法 发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 ... -
STM32 串口首字节和尾字节
2020-08-10 13:34:28STM32 串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x... -
[SHELL]用命令行写串口数据
2019-10-06 23:09:29首先知道有stty这个命令,这个命令可以设置串口参数,然后就可以命令行:echo start > /dev/ttyUSB0发送了,根本不需要串口调试minicom: 用法:stty [-F 设备 | --file=设备] [设置]... 或:stty [-F 设备 |... -
串口服务器N668使用HTTP POST方式向网页服务器提交数据
2021-08-05 05:05:00一、数据流向 二、资料下载三、测试1、将串口服务器USR-N668的串口通过串口线(或USB 转串口线)与PC相连接,检测硬件连接无错误后,接入我们配送的电源适配器,给668供电。2、按路径:控制面板找到“windows防火墙”... -
LabVIEW串口通信故障处理步骤
2022-02-06 20:52:51LabVIEW串口通信故障处理步骤 串口设备不响应命令时,请按如下步骤排除故障。 确保串口线工作正常。坏了的串口线会导致这一问题。 用零调制解调器将计算机和计算机之间的串口通信收发信号反转。 运行LabVIEW... -
使用AndroidStudio自带模拟器挂载串口不能接收超过8字节的数据
2019-12-04 17:49:45一旦串口助手发送超过8字节的数据,模拟器就会卡住,过一会儿挂掉,查看日志也找不出原因。模拟器倒是可以发送超过8字节的数据。 开始以为是应用程序的问题,应用程序是依赖Google的开源库android-serialport-api的... -
C#串口通信—向串口发送数据,同步接收返回数据
2015-01-16 21:59:00SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件。经过测试,可以正常使用。 ... -
STM32串口第一个字节丢失问题的分析过程
2021-01-15 00:36:11STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03... -
重启(计算机术语)_百度百科
2021-06-24 11:37:16重启,是计算机操作通俗...中文名重启外文名restart用法计算机操作通俗用语意思重新启动重启分类强制重启 自动重启重启概念编辑语音重新启动(reboot)是重新打开计算机而且重新装载操作系统;在支持快速启动的Wind... -
Linux下接收串口数据0x0d变0X0a问题
2020-09-10 08:57:09许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。不用说也知道,这几个肯定是特殊字符...