2013-08-22 158 views
2

我已经编写了从串口读取数据作为字节数组并将其显示在文本框中的代码。代码编译正常,但无法正常工作:从串口读取字节

private void button2_Click(object sender, EventArgs e) 
{ 
    if (serialPort1.IsOpen == false) 
     serialPort1.Open(); 
    serialPort1.WriteLine(textBox1.Text); 
    int bytes = serialPort1.BytesToRead; 
    byte[] byte_buffer = new byte[bytes]; 
    serialPort1.Read(byte_buffer, 0, bytes); 
    //textBox2.Text = " "; 
    for (int t = 0; t < bytes; t++) 
    { 
     textBox2.Text += (byte_buffer[t]).ToString(); 
    } 
} 
+1

你有调试过吗? textBox1.Text中是否有价值? 另外你如何创建串行端口?串口端口=新串口( “COM1”,9600,Parity.None,8,StopBits.One); ETC ... – Pogrindis

+1

_“代码无法正常工作”_ - 解释原因,显示输入和输出以及您希望发生的事情。 – CodeCaster

+0

yes.i已经使用SerialPort port = new SerialPort(“COM1”,9600,Parity.None,8,StopBits.One)创建了串口。有时在textbox1没有价值,有时错误的价值“的代码无法正常工作”的意思是:例如,当我在键盘上按“s”我看不到它在textbox1中的值。 –

回答

1

使用button2事件将数据发送到端口。将所需的代码(用于发送数据)放入SynchronizationContext(使用方法SynchronizationContext.Post)。

接下来,注册在SerialPort类的DataReceived事件检索,做阅读有(再次封闭到同一SynchronicationContext对象,否则你会得到串口读取/写入超时)

干杯,

3
serialPort1.WriteLine(textBox1.Text); 
    int bytes = serialPort1.BytesToRead; 

字节值将总是为零。除非你调试这个代码,并且单步调整它来减慢速度。使用WriteLine()编写的字节需要传输时间。设备处理它们需要时间。收到回复需要时间。这增加了很多毫秒。

您需要通过循环来解决这个问题,重复调用Read()方法直到获得完整响应。如果您正确设置了SerialPort.NewLine属性,那么您将会有一些可能性,只需调用ReadLine()就足以解决您的问题。