日期:2014-05-17  浏览次数:20984 次

C# serialport类串口通信问题
最近买了一个设备,是USB接口的,插到电脑上为虚拟串口com3。利用serialport类编写了串口读写功能,但程序始终无法进入DataReceive事件。利用portmon软件监测,当设备自带软件发送特定指令时,会收到数据。为什么我编的软件就是读取不到数据,跪求大家指导!谢谢,在线等~~~

------解决方案--------------------
如果是在程序内new的serialport类对象,请绑定接收事件
而且要注意你发送数据的格式一定不能错
------解决方案--------------------
用串口调试助手调试下,不行把代码贴出来看看。
------解决方案--------------------
如何软件的设置和事件接收都像你说的没有问题,并且数据发送了,应该是能接收到的
另外usb转串口有时会出问题的,以前用的就是这样,有时收到有时收不到,后来换了一个就好了
------解决方案--------------------
port1_DataReceived这个有问题
 string str = port1.ReadExisting();这个已经把数据全读完了
你下面就读取不到了
 port1.Read(readBuffer, 0, readBuffer.Length);就是这个读取已经没数据了
------解决方案--------------------
没看出其他问题来
看下物理串口是不是COM3
试试直接发送字符串,不要写字节数组

------解决方案--------------------
如果其它软件可以正常使用,硬件就应该是没问题的。你的程序不能通信,可能是因为对端需要流控制,而你没有设置相关参数而已,将DtrEnable RtsEnable两个参数设置为true吧。

另外接收函数中不要使用sleep,不要操作界面,不要执行长时间的运算,只将数据保存到缓冲区就好了,使用另一个线程(或者异步)处理数据,否则会莫名奇妙的丢数据。




------解决方案--------------------
你用我这个C#带源码的串口调试工具调试下看看,收发数据情况。
http://download.csdn.net/detail/yeqi3000/4853494
------解决方案--------------------
可以用232、485看看是否发送了指令,也许你用的读取方式不对,有ASCLL和十六进制读取方式,你要哪种方式读取
------解决方案--------------------
port1_DataReceived 的问题,你要看你接收的是字符串还是16进制的数据,加一个选项设置一下,比如起名叫协议,当为字符串时用ReadExisting(),然后做处理,

否则为16进制的数据,用Read(readBuffer, 0, readBuffer.Length),然后处理

最后用BeginInvoke去显示结果


------解决方案--------------------
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (e.EventType != SerialData.Chars)
                return;
            if (sp.BytesToRead <= 0) return;
            byte[] ReadBuf = new byte[sp.BytesToRead];
            sp.Read(ReadBuf, 0, ReadBuf.Length);
            //接收数据
            lock(queMsgs) queMsgs.Enqueue(ReadBuf);            
            PostMessage(this.handler, MsgId, 0, 0);
        }