从微控制器读取

时间:2010-11-21 08:08:43

标签: c# serial-port arduino

我有一个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秒钟“拍摄”数据。

3 个答案:

答案 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;