我有一个应用程序,它使用串口通信连接外部协议。
我需要知道每个发送到我的数据包中是否设置了唤醒位(第9位),并且通信速率必须低于40毫秒,并且在20毫秒内必须发送响应。该框架封装了从端口读取的位,并仅向我发送8位数据。此外,由于时间问题,我不能等待奇偶校验错误事件。
我需要知道如何读取第9位,或者是否有免费替代方案,可参考http://www.wcscnet.com/CdrvLBro.htm
我有一个应用程序,它使用串口通信连接外部协议。
我需要知道每个发送到我的数据包中是否设置了唤醒位(第9位),并且通信速率必须低于40毫秒,并且在20毫秒内必须发送响应。该框架封装了从端口读取的位,并仅向我发送8位数据。此外,由于时间问题,我不能等待奇偶校验错误事件。
我需要知道如何读取第9位,或者是否有免费替代方案,可参考http://www.wcscnet.com/CdrvLBro.htm
你尝试过将串口读取函数放在奇偶校验错误事件处理程序中吗?根据驱动程序的不同,这可能足够快。
这难道不是为某个老虎机协议而做的吗?我为了你的乐趣做了这个。也许它会起作用?
{
public Form1()
{
InitializeComponent();
}
SerialPort sp;
private void Form1_Load(object sender, EventArgs e)
{
sp = new SerialPort("COM1", 19200, Parity.Space, 8, StopBits.One);
sp.ParityReplace = 0;
sp.ErrorReceived += new SerialErrorReceivedEventHandler(sp_SerialErrorReceivedEventHandler);
sp.ReadTimeout = 5;
sp.ReadBufferSize = 256;
sp.Open();
}
object msgsLock = new object();
Queue<byte[]> msgs = new Queue<byte[]>();
public void sp_SerialErrorReceivedEventHandler(Object sender, SerialErrorReceivedEventArgs e)
{
if (e.EventType == SerialError.RXParity)
{
byte[] buffer = new byte[256];
try
{
int cnt = sp.Read(buffer, 0, 256);
byte[] msg = new byte[cnt];
Array.Copy(buffer, msg, cnt);
if (cnt > 0)
{
lock (msgsLock)
{
msgs.Enqueue(msg);
}
}
}
catch
{
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (msgs.Count > 0)
{
lock (msgsLock)
{
listBox1.Items.Insert(0, BitConverter.ToString(msgs.Dequeue()));
}
}
}
}
无论如何,如果您想更好地控制串口,建议使用win32调用以获得所需内容。