与微控制器的C#串行通信问题
我在Visual Studio C#环境中与嵌入式设备进行串行通信时遇到问题,当前的解决方案是使用以下配置与putty会话进行通信:与微控制器的C#串行通信问题,c#,serial-port,microcontroller,C#,Serial Port,Microcontroller,我在Visual Studio C#环境中与嵌入式设备进行串行通信时遇到问题,当前的解决方案是使用以下配置与putty会话进行通信: 波特率>9600 数据位>8 停止位>1 奇偶校验>无 流量控制>RTS/CTS 每次建立连接时,putty终端上都会显示一个菜单,显示控制器的可用命令 我尝试了以下从MS示例中借用的方法: public class PortChat { static bool _continue; static SerialPort _serialPort
- 波特率>9600
- 数据位>8
- 停止位>1
- 奇偶校验>无
- 流量控制>RTS/CTS
public class PortChat
{
static bool _continue;
static SerialPort _serialPort;
public static void Main()
{
// Create a new SerialPort object with default settings.
_serialPort = new SerialPort();
_serialPort.PortName = "COM4";
_serialPort.BaudRate = 9600;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.RequestToSend;
// Set the read/write timeouts
_serialPort.ReadTimeout = 5000;
_serialPort.WriteTimeout = 5000;
_serialPort.Open();
Thread.Sleep(1000);
}
}
在“port.Open”之后读取端口会导致异常,请参见第一个屏幕截图。
写入端口也会导致异常,请参见第二个屏幕截图。
我错过了什么
多谢各位
ReadLine等待,直到它看到SerialPort.NewLine字符串。如果未在SerialPort.ReadTimeout内到达,则会引发TimeoutException。增加超时时间或使用
ReadExisting()
见:
根据MSDN:[SerialPort.ReadTimeout]获取或设置读取操作未完成时发生超时之前的毫秒数。
见:
默认情况下,ReadLine方法将阻塞,直到收到一行。如果不需要此行为,请将ReadTimeout属性设置为任何非零值,以在端口上没有可用的行时强制ReadLine方法引发TimeoutException。
请参阅:也许会有帮助。@Louis Go谢谢Louis,但这不是同一件事,我可以使用相同的端口设置与putty通信,不会出现任何问题,也不会对port.open引发异常。您的.Net framework是否比4.0更新?我记得旧版本是有缺陷的。对不起,没什么帮助。@Louis Go,如果我使用_serialPort.ReadExisting()的话,它是框架版本4.5;打开端口后,我总是得到一个“”字符串。如果我将读/写超时设置为2秒,这是足够的,那么两个都会超时。我想知道这是否与RTS/CTS流量控制有关?但是putty怎么处理得这么顺利?@user3255590在
\u serialPort.Read
中有原始数据吗?ReadExisting()
方法返回serialPort数据接收缓冲区中的所有字符。因此,当调用此方法时,您只能得到一半的消息。最好的方法是使用DataReceived
事件,当字符通过串行端口时触发该事件,并使用ReadExisting
获取字符。我这里有一个很好的例子:@Baddack,我不知道如何将您的示例集成到我的代码中:我们如何处理您的函数?private void serialPort1_DataReceived(对象发送方,System.IO.Ports.SerialDataReceivedEventArgs e)mySerialPort.DataReceived+=新的SerialDataReceivedEventHandler(DataReceivedHandler)代码>将创建DataReceived事件。请参阅Microsoft示例: