Serial port 用于Windows CE 6.0的.net compact 2.0中的dataReceived事件对于串行通信仅起一次作用
我有一个简单的串口程序,用来读取串口并回显键入的字符。我可以通过使用计时器轮询接收到的序列号来让它正常工作,但我想改用dataReceived事件。由于某种原因,该事件将发生一次,但不会再次发生Serial port 用于Windows CE 6.0的.net compact 2.0中的dataReceived事件对于串行通信仅起一次作用,serial-port,compact-framework,windows-ce,c#-2.0,Serial Port,Compact Framework,Windows Ce,C# 2.0,我有一个简单的串口程序,用来读取串口并回显键入的字符。我可以通过使用计时器轮询接收到的序列号来让它正常工作,但我想改用dataReceived事件。由于某种原因,该事件将发生一次,但不会再次发生 SerialPort bsp; public Form1() { InitializeComponent(); bsp = new SerialPort("COM2", 2400, Parity.None, 8, StopBits.One);
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上输入更多的键时,我可以看到这个值在上升,这台PC可以与Windows CE设备串行通信。我遗漏了什么吗?我们在
Read()
中遇到了类似的问题,但我们使用ReadExisting()
来管理它,以始终读取整个缓冲区。这可能是允许引发下一个事件的事实
之所以包括Sleep(500)
,是因为在将第一个字节写入缓冲区时会引发事件。通过一些尝试/错误,我们知道我们正在阅读的消息从未超过特定的长度,我们知道它们将在事件发生500毫秒内(事实上是很久以前)被完全写入
有点碰运气,我会非常高兴看到一个“正确”的解决方案从一个串行专家
守则:
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();
}
}