2010-11-21 219 views
3

我有一个Arduino微控制器。该微控制器的作品(我有一个应用程序,显示我的微控制器“吐”出的数据的事情是,我已经实现了一些代码(从http://www.c-sharpcorner.com/uploadfile/eclipsed4utoo/serialportcommunication12082008111137am/serialportcommunication.aspx):从微控制器读取

在这里,我初始化一个串口

_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 }); 
} 

,但我得到这个错误:在处理程序The operation has timed out.string data = _serialPort.ReadLine();

COM端口为COM17,端口打开(微控制器上的LED指示灯显示)。任何想法为什么手术超时?

即加载到微控制器中的程序被设置为在1秒内“拍摄”数据。

+0

thread.sleep背后有原因吗?只有当数据准备好被接收后,函数才会被调用吗? – 2010-11-21 08:17:08

+0

如果我评论thread.sleep,程序停止更快。 (即快1秒) – Alex 2010-11-21 08:23:56

+0

你是否尝试将这些COM设置放入超级终端(或者任何你有的COM端口控制台)?你是否尝试了更长的超时时间,比如30秒开始? – 2010-11-21 08:34:22

回答

2

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

您还应该实现ErrorReceived事件,以便您可以检测通信错误。当通信参数不匹配时你会得到的那种,比如波特率,奇偶校验,数据位和停止位。

+1

@Badescu:如果汉斯的回答中不清楚,ReadLine将不会返回,直到它读取行尾字符或超时。这听起来像你的设备没有发送EOL。 – Tergiver 2010-11-21 15:18:57

+0

@Hans抱歉评论一个旧的答案,但我有一个[问题](http://stackoverflow.com/q/18789887/2208810)与串行通信,我搜索了很多类似的问题,我没有找到任何答案,但你能给我一些帮助吗? – mafap 2013-09-13 22:57:53

1

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

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

0

如果有问题的Arduino是Leandro,Micro或其他基于Atmega32u4的主板,则需要将RTS和DTR设置为高,否则您将不会收到任何数据。

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