我写了一个RS422串口的驱动,驱动在stty下运行可以正常通讯,但是在程序中使用termios.h库函数操作时却无法通讯,这会是什么原因?
是驱动问题,还是程序问题?
另,在系统当机的情况下如何去分析当机的原因呢?Xtang大侠,看到了请不吝赐教呀!
我写了一个RS422串口的驱动,驱动在stty下运行可以正常通讯,但是在程序中使用termios.h库函数操作时却无法通讯,这会是什么原因?
是驱动问题,还是程序问题?
另,在系统当机的情况下如何去分析当机的原因呢?Xtang大侠,看到了请不吝赐教呀!
是驱动。
你可以试试最一般的程序,ls >/dev/myserial或是qtalk -m /dev/myserial,看看能不能用。stty只设一些标志位,并不涉及实际硬件操作。
另,在系统当机的情况下如何去分析当机的原因呢?Xtang大侠,看到了请不吝赐教呀!
系统当机是有显示当机信息吗?如果是,这里有介绍http://www.qnx.com/developers/docs/6.3.0SP2/neutrino/technotes/proc_dump.html
如果系统直接停止没有信息,先试试缩小范围。有自己写的驱动的话,主要查中断处理部份。把InterruptAttach()改成InterruptAttachEvent()试试会不会再现问题。
总算等到了一个回复:)
可惜问题越看越麻烦了:(
系统不是当机,是没有响应了,死机的时候中断线拉高,可能是中断处理的问题.
我的驱动是基于DDK改的,只是把io空间的地址改为memory空间的地址而已.
但是系统还有一个奇怪的现象,在系统最初的几次启动(3~10次)时,串口通讯会发生故障导致死机,而在这之后串口能够正常通讯. 如果关闭系统一段时间以后(半个小时左右),再次重新启动机器后重复发生上述现象.
串口使用FIFO模式时出现故障,不使用FIFO模式串口能够正常使用.
FIFO模式下串口的具体设置为:
Name: /dev/ser1 Type: serial Opens: 1
+raw +iexten +echoke +echoctl +imaxbel +onlcr
intr=^C quit=^\ erase=^? kill=^U eof=^D start=^Q stop=^S susp=^Z lnext=^V min=01 time=00 pr1=^[
pr2=5B left=44 right=43 up=41 down=42 ins=40 del=50 home=48 end=59
par=even -inpck bits=8 stopb=1 baud=38400 rows=0,0
串口的硬件只连接了RX+,RX-,TX+,TX-四个线,不知道是不是有影响?
xtang,今天试了一下您说的方法,
用ls > /dev/ser1返回结果正常,
另外我写了一个shell脚本,这样在终端里实现两个端口同时收发返回结果也是正确的.
两个端口的设置和程序里是一样的,只是延时稍有不同.
但是一跑程序就…
已经晕了.555555
整个没有头绪了,该从哪里下手?
问题进一步让人困惑了,
我用termios.h进行串口设置进行串口通讯测试没有问题.
测试程序和应用程序对串口操作的区别就只在于测试程序使用write,read操作串口,而应用程序使用fstream操作串口了,
我准备下一步测试fstream操作是否会导致系统被冻结.
现在我最大的问题是无法判断到底是什么导致了系统被冻结的状况:
如何确定问题的来源?
请大家给个建议.谢谢.
能够导致系统冻结,我还是怀疑驱动程序。测试程序不能导致出错,可能是因为数据量的问题。你可以试试在测试程序里用fstream看能不能造成出错。
不用FIFO就正常,说明还是中断处理部份有问题。如果有源码,先把中断处理InterruptAttach()改成InterrupAttachEvent()看看?
另外,串口有时工作有时不工作,听上去好象串口初始化没有做好?
也可能跟本就是硬件问题,换板子试试?
问题出现在读寄存器的时候?很疑惑.
我按照前面获得的帮助把中断处理放到了用户空间进行调试,发现程序在读取接收缓冲寄存器的时候造成死机.
后来做了一个简单的程序,直接读取寄存器的内容也会造成死机,估计问题是出现在这个地方,然后在中断处理里面读取该寄存器的时候加了延时,状况有所好转,但是依旧让人觉得奇怪:
机器上有两个相同的串口,共用一个中断,使用同一个驱动和中断处理程序,驱动是根据QNX的DDK改的,主要变动的地方就是把IO操作改为Memory操作,原来两个串口都有需要多次启动的毛病,但是加了延时以后,串口二可以很好的实现通讯,但是串口一却一如既往的死机,就算把延时加到20ms都会这样:cry:
直接读取寄存器也不死机了,但是中断处理还是死在读寄存器的时候,死机的时候芯片有片选信号,确没有读写信号
这是为什么呢?芯片肯定没有问题,使用IO端口实现驱动的话就没有问题,IO和Memory的处理在硬件和操作系统上有什么不同呢?时序亦或是其他的什么问题?请大侠指教