C# 从微控制器读取数据

C# 从微控制器读取数据,c#,serial-port,arduino,C#,Serial Port,Arduino,我有一个Arduino微控制器。微控制器工作正常(我有一个应用程序显示微控制器“吐”出数据。问题是我实现了一些代码(来自): 这里我初始化串行端口 _serialPort = new SerialPort("COM17", 19200, Parity.None, 8, StopBits.One); _serialPort.Handshake = Handshake.None; _serialPort.DataReceived += new SerialDataReceivedEventHandl

我有一个Arduino微控制器。微控制器工作正常(我有一个应用程序显示微控制器“吐”出数据。问题是我实现了一些代码(来自):

这里我初始化串行端口

_serialPort = new SerialPort("COM17", 19200, Parity.None, 8, StopBits.One);
_serialPort.Handshake = Handshake.None;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
_serialPort.ReadTimeout = 1000;
_serialPort.WriteTimeout = 1000;
_serialPort.Open();
这里有一个监听处理器:

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Thread.Sleep(1000);
    string data = _serialPort.ReadLine();
    this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
}
但是我得到了这个错误:
操作超时。
在处理程序中的
string data=\u serialPort.ReadLine();

COM端口为COM17,端口打开(微控制器上的led显示)。知道操作超时的原因吗


i、 e.加载到微控制器中的程序设置为1秒“拍摄”数据。

问题的根源可能在线路的另一端。要让SerialPort.ReadLine()完成且不生成超时错误必须传输行尾字符序列。SerialPort.NewLine的值,默认为换行控制字符(“\n”)。如果传输字节而不是字符,则应使用Read()


您还应该实现ErrorReceived事件,以便能够检测通信错误。当通信参数不匹配时,例如波特率、奇偶校验、数据位和停止位,您将得到这种错误。

您不能假设当DataRcvd事件处理程序启动时,您拥有另一端发送的所有内容。您可能是接收片段,即微控制器发送ABCDEFGHI(newlinechar),事件处理程序在缓冲区中使用ABC激发


我同意,如果微控制器不发送新线,那么它将永远不会工作。

如果所讨论的Arduino是Leandro、micro或其他基于Atmega32u4的板,您需要将RTS和DTR设置为高,否则您将不会收到任何数据

_port.Handshake = Handshake.None;
_port.Open();
_port.RtsEnable = true;
_port.DtrEnable = true;

thread.sleep背后有什么原因吗?函数不是只有在数据准备好接收时才会被调用吗?如果我对thread.sleep进行注释,程序就会更快地停止。(即,快1秒钟)您是否在超级终端(或您拥有的任何COM端口控制台)中尝试了这些COM设置?您是否尝试过更长的超时时间,比如30秒的启动时间?arduino微控制器带有一个显示控制台,工作正常。我尝试了更长的超时时间,但出现了相同的问题。我找到了一个更好的程序,适用于任何感兴趣的人!!!!@Badescu:如果Hans的响应不清楚,ReadLine在读取之前不会返回“是行尾字符,或超时。听起来你的设备没有发送下线。@Hans很抱歉评论了一个旧的答案,但我与串行通信有冲突,我搜索了很多类似的问题,但还没有找到任何答案,你能给我一些帮助吗?”?