简介:本来这应该是无比基础的一个设计,然而却让我折腾了两天
大致情况是这样的,我写了一个USB应用的工程,下位机是基于32U4的Leonardo,而我的上位机使用WPF来写,然后在一切就绪之后,我发现我的代码并不能正常的运作,点击发送却收不到数据。
首先我试着检查了线程的运作,并没有发现问题,一切都很好,因为串口部分的处理和收发代码是我从上一个工程中拷贝的。
然后我试着检测下位机的代码,并且加入了众多的调试语句,比如这样的
Serial.print("Input Data: ");
Serial.println(comdata);
Serial.print("Input Data length: ");
Serial.println(comdata.length());
还有这样的。为了确认是不是发的太快导致Buffer部分可能出现问题,加了很长的延迟
if (Serial.available() > 0)
{
char c = Serial.read();
if (c == '1')
{
delay(10);
Serial.println("Received 1");
} else if (c == '0')
{
delay(10);
Serial.println("Received 0");
}
delay(1000);
Serial.println("Dat");
}
然而,结果是,我依然不能找到解决的方法,但是在IDE中我可以正常的收发数据,SSCOM(串口调试助手)中也能正常收发,我试着将代码烧到一块328P(UNO)上也可以正常的收发数据,因此,我认为原因并不是出自于下位机的代码如何,而是USB转串口驱动方面与C#这边兼容性的问题。
而这个问题主要就是国产Leonardo这边的问题了,因为没有烧录器没法重新烧写一遍bootloader,所以我暂时不能确定是否和这个有关系。
总结下目前状态:
1.代码是正确的,因为328P上可以正常运行,使用非WPF+C#开发的串口调试工具也能正常的收发
2.上位机软件的收发代码是正确的
3.数据有正常的发送到下位机,因为RX指示灯在发送数据后有闪烁
如果要尽快解决这一个问题,我需要先找一个类似的可以正常接收的软件,分析和我写的有什么区别。如果说WPF本身这个架构可能不兼容,我应该先找一个类似的界面架构来检查问题。
因为最接近WPF的还是winform,所以我从PUDN(程序员软件开发网)上找到了几个winform界面的串口调试软件,其中有一个能正常的使用
http://www.pudn.com/Download/item/id/3651885.html
好的,经过确定这个软件可以正常的接收我的下位机(Leonardo)所传送的数据,并且显示在文本框内
这会,我需要建立一个新的工程来将他的代码的核心部分移植出来并进行测试。建立了一个WPF工程后,绘制了简单的界面,保留串口所应该有的必要的部分内容。一些串口的配置,包括波特率、停止位和校验位,直接在程序中赋值。
将winform的界面相关代码转换为wpf,软件使用.NET 4我也在属性中将我现有工程的.NET版本更改为4.0
没有效果,那么我需要重新找一下原因,是不是漏了什么配置,我试着添加了while(!Serial)来使得我能够判断串口是否正常的开启,也因此,最后,我发现是配置这块的问题
Leonardo如果要开启串口连接,必须接受一个复位信号,而这个信号默认是不发送的!UNO等其他328P的芯片的板子则无需这个复位信号。
整个问题缘于这个部分没有配置
serialport.RtsEnable = true;
问题解决