我有简单的串口程序,应该读取串口并回显输入的字符。我可以通过轮询使用计时器收到的序列来使这个工作正常,但我想使用dataReceived事件。由于某种原因,事件将发生一次但不会再发生。
SerialPort bsp;
public Form1()
{
InitializeComponent();
bsp = new SerialPort("COM2", 2400, Parity.None, 8, StopBits.One);
bsp.DataReceived +=new SerialDataReceivedEventHandler(whasup);
System.Threading.Thread.Sleep(1000);
bsp.Open();
}
void whasup(object sender, SerialDataReceivedEventArgs e)
{
char[] text = new char[100];
int temp = bsp.BytesToRead;
string j = temp.ToString();
bsp.Read(text, 0, temp);
bsp.Write(text, 0, temp);
}
我尝试将其移植到PC上并且效果很好,但在这个Windows CE设备上它确实不想合作。我知道串行对象仍然是打开的,因为我有一个计时器在Win CE设备上运行吐出文本,即使它停止回显其接收数据。我还有定时器输出bsp.BytesToRead,我可以看到这个值越来越高,因为我在我的PC上键入了更多的密钥,这些密钥与Windows CE设备串行通信。我错过了什么吗?
答案 0 :(得分:0)
我们遇到了与Read()
类似的问题,但使用ReadExisting()
进行了管理,以便始终读取整个缓冲区。可能是这个事实允许引发下一个事件。
包含Sleep(500)
,因为只要第一个字节写入缓冲区就会引发事件。通过一些试验/错误,并且知道我们阅读的信息从未超过特定的长度,我们知道它们将在事件的500ms内(实际上很久以前)完全写入。
有点击中/未命中,我非常乐意看到来自串行专家的'正确'解决方案!
代码:
private SerialPort port;
private object readLock = new object();
private SerialManager()
{
port = new SerialPort(SerialPort, BaudRate, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.None;
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Lock to subsequent DataReceived events
lock (readLock)
{
Thread.Sleep(500);
string data = port.ReadExisting();
}
}