原创 java串口通信应用程序debug记录

2014-3-8 23:00 1270 10 10 分类: 软件与OS

在调试一个PC通过串口接收从单片机发送数据的应用时,发现收到的数据有错误。

先直接说最后的结果吧,下面再详述过程。

 

debug后的结果:

我原来是使用RXTXcomm的库,用单独线程从InputStream读数据并进行帧处理的架构。

改为用SUN的javacomm20-win32库,用其提供的事件处理机制,在事件处理函数中进行帧处理。

问题解决,但发现不一定是RXTXcomm库的问题,可能是架构的原因。

 

 

debug过程:

应用简述:一个CC2530终端模块A/D采集音频信号(8k/s*8bit=64kb/s),发送给CC2530网关模块,通过串口转发给PC,PC上的java串口软件播放音频。

问题:发现有突变的噪声数据。

步骤1:一个终端模块用同样的速率及帧结构发送固定的数据,PC上编写log程序将收到的数据保存为文件。

检查文件,发现两类问题:

1、帧不完整:偶尔有帧只收到一部分;

2、数据发生变化;

 

怀疑存在问题的地方:

1、网关模块串口转发使用的模块化函数;

2、PC侧的串口读函数处理不够快;

3、终端模块和网关模块之间的数据通信;

 

步骤2:编写网关模块程序,采用寄存器直接写方式发送固定内容的分组给PC,发现问题仍然存在。

因为网关模块与PC之间的连接方式是通过TTL电平的串口转USB模块转接,网关模块是用USB的3.3v供电,于是怀疑有没有3v和5v电平之间的差异问题。

步骤3:使用3232模块将网关模块的TTL电平转为RS232标准信号再与标准USB转串口模块连接,发现问题仍然存在。

 

于是怀疑的地方包括:

1、网关模块的串口通信实现方式产生误码;

2、PC侧的串口读函数处理过程造成误码;

 

步骤4:抱着试一试的想法,在网上搜索其它java串口实现方式,下载了SUN的串口通信库。改写其simple example中的SimpleRead.java,将收到的数据保存在文件中。

发现没有错误。

于是认为是RXTXcomm的问题。

 

步骤5:

改写我原来的应用中串口处理代码,为了少改动,架构上和原来保持一致,都是从串口接口类中获取InputStream,然后交给一个单独的线程不断地从中读字节,进行帧界定,然后将帧交给应用。

结果发现问题又出来了。

 

步骤6:

将代码改为使用SerialPort的EventListener来收数据并进行帧定界。问题解决。

 

所以目前还没能确定原问题是RXTXcomm的原因还是架构的原因。

 

附件说明:

javacomm20-win32.zip是SUN的串口库,从网上下的。

 

commapi_test.zip是尝试SUN库的例子,从原来的SimpleRead.java例程改写。

其中SimpleRead.java直接显示收到的十六进制数据;

SimpleRead.java将收到的数据按指定长度成帧再输出;

 

rxtx_debug.zip是应用中与串口接口的工具类,原来使用的是CommController和SerialReader,现在使用的是CommControllerSun和SerialReaderSun。

测试时运行run_log.bat。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /3 下一条