请问Xtang一个串口驱动的问题,谢谢先

我写了一个RS422串口的驱动,驱动在stty下运行可以正常通讯,但是在程序中使用termios.h库函数操作时却无法通讯,这会是什么原因?
是驱动问题,还是程序问题?

另,在系统当机的情况下如何去分析当机的原因呢?Xtang大侠,看到了请不吝赐教呀!

是驱动。:slight_smile:

你可以试试最一般的程序,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操作是否会导致系统被冻结.

现在我最大的问题是无法判断到底是什么导致了系统被冻结的状况:

  1. 虽然是在进行串口通讯后才会系统冻结,但是使用串口通讯测试程序并不会出现这个状况;
  2. 同样的系统(整合的CPU卡 & CF卡)在不同的底板上有不同的特性,某些底板完全能够正常工作;
  3. 同样的系统在多次启动以后也能正常工作;

如何确定问题的来源?
请大家给个建议.谢谢.

能够导致系统冻结,我还是怀疑驱动程序。测试程序不能导致出错,可能是因为数据量的问题。你可以试试在测试程序里用fstream看能不能造成出错。

不用FIFO就正常,说明还是中断处理部份有问题。如果有源码,先把中断处理InterruptAttach()改成InterrupAttachEvent()看看?

另外,串口有时工作有时不工作,听上去好象串口初始化没有做好?
也可能跟本就是硬件问题,换板子试试?

问题出现在读寄存器的时候?很疑惑.
我按照前面获得的帮助把中断处理放到了用户空间进行调试,发现程序在读取接收缓冲寄存器的时候造成死机.
后来做了一个简单的程序,直接读取寄存器的内容也会造成死机,估计问题是出现在这个地方,然后在中断处理里面读取该寄存器的时候加了延时,状况有所好转,但是依旧让人觉得奇怪:
机器上有两个相同的串口,共用一个中断,使用同一个驱动和中断处理程序,驱动是根据QNX的DDK改的,主要变动的地方就是把IO操作改为Memory操作,原来两个串口都有需要多次启动的毛病,但是加了延时以后,串口二可以很好的实现通讯,但是串口一却一如既往的死机,就算把延时加到20ms都会这样:cry:
直接读取寄存器也不死机了,但是中断处理还是死在读寄存器的时候,死机的时候芯片有片选信号,确没有读写信号 :frowning:
这是为什么呢?芯片肯定没有问题,使用IO端口实现驱动的话就没有问题,IO和Memory的处理在硬件和操作系统上有什么不同呢?时序亦或是其他的什么问题?请大侠指教 :open_mouth: