我有一个Arduino微控制器。微控制器工作(我有一个应用程序,向我显示微控制器'吐出'数据。事情是我已经实现了一些代码(来自http://www.c-sharpcorner.com/uploadfile/eclipsed4utoo/serialportcommunication12082008111137am/serialportcommunication.aspx):
这里我初始化SerialPort
_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 :(得分:2)
问题的根源可能在电线的另一端。要让SerialPort.ReadLine()完成并且不生成超时错误,您必须传输行结束字符序列。 SerialPort.NewLine的值,默认为换行控制字符(“\ n”)。如果您传输字节而不是字符,那么您应该使用Read()代替。
您还应该实现ErrorReceived事件,以便检测通信错误。当通信参数不匹配时,您将获得的类型,如波特率,奇偶校验,数据位和停止位。
答案 1 :(得分:1)
您不能假设当DataRcvd事件处理程序触发您拥有另一端发送的所有内容时。您可能正在收到碎片,即微控制器发送ABCDEFGHI(newlinechar),并且事件处理程序在缓冲区中触发ABC。
我同意,如果微控制器没有发送换行符,那么它将永远无法工作。
答案 2 :(得分:0)
如果Arduino是Leandro,Micro或其他基于Atmega32u4的主板,您需要将RTS和DTR设置为高电平,否则您将无法接收任何数据。
_port.Handshake = Handshake.None;
_port.Open();
_port.RtsEnable = true;
_port.DtrEnable = true;