我正在制作键盘项目。第一个用户输入是一个10位数的ID。然后按6位密码。我一直在考虑如何在从串口接收输入时将两个输入分配到不同的阵列。这是我到目前为止的尝试。
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
char[] id = new char[11];
char[] pass = new char[7];
int length;
try
{
serialPort1.ReadTimeout = 100;
do
{
length = serialPort1.Read(id, 0, 11);
} while (length > 0);
}
catch (TimeoutException) { MessageBox.Show(id.ToString()); }
try
{
serialPort1.ReadTimeout = 100;
do
{
length = serialPort1.Read(pass, 0, 7);
} while (length > 0);
}
catch (TimeoutException) { MessageBox.Show(pass.ToString()); }
}
调试后,问题是:
MessageBox.Show()
只会显示空的char数组。ReadTimeout
,用户需要在给定时间内按下键盘,这在设计上并不灵活。 真的欢迎任何帮助或提示。提前致谢。如果你这么做,我不介意从头开始构建。
答案 0 :(得分:3)
我的建议是:
DataReceived
来自serialPort1_DataReceived
对象serialPort1
{li>对于id
char
数组,缩小为10
而不是11
,因为您正在读取10位数字
pass
char
数组,将其缩减为6
建议代码:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// unhook event
serialPort1.DataReceived -= serialPort1_DataReceived;
char[] id = new char[10];
char[] pass = new char[6];
try
{
// send unique start bit from connected serial port device to indicate begin of transmission
byte ack = serialPort1.ReadByte();
while (ack != 0xC0)
{
ack = serialPort1.ReadByte(); // <- continuously read from serial port until start bit is found
}
// try to increase timeout as 100 ms is too fast
serialPort1.ReadTimeout = 1000;
for (int i = 0; i < 10; i++)
{
id[i] = (char)serialPort1.ReadByte();
}
}
catch (TimeoutException) { MessageBox.Show(id.ToString()); }
try
{
// send unique start bit from connected serial port device to indicate begin of transmission
byte ack = serialPort1.ReadByte();
while (ack != 0xC0)
{
ack = serialPort1.ReadByte(); // <- continuously read from serial port until start bit is found
}
// try to increase timeout as 100 ms is too fast
serialPort1.ReadTimeout = 1000;
for (int i = 0; i < 6; i++)
{
pass[i] = (char)serialPort1.ReadByte();
}
}
catch (TimeoutException) { MessageBox.Show(pass.ToString()); }
// rehook event
serialPort1.DataReceived += serialPort1_DataReceived;
}
答案 1 :(得分:2)
这是出错的地方
id
代码意味着尝试将11字节读入id,然后返回实际读取的字节数。因此,如果有100个字节可用,则长度为11.如果只有5个字节可供读取,则长度将为5.因为长度> 1。 0,它再次循环尝试再次读取11个字节,直到它什么都不读。当您将数据读入同一阵列时,后续读取将覆盖上一次读取中的数据。
与
相同4