tag 标签: java串口

相关博文
  • 热度 10
    2014-3-8 23:00
    1269 次阅读|
    0 个评论
    在调试一个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。