我正在尝试通过串口发送一些二进制数据。我一次发送512字节页面并使用ASCII作为控制命令。我有大约150页要发送,除了第97页,它们都能正常工作。
字节330是0xCC。如果我将其更改为其他任何页面正确发送。如果是0xCC,则SerialPort.Write仅发送509个字节而不是512个字节。周围的确切字节序列是:
...2E 21 96 CC 33 D1 05 81...
我的代码如下所示:
var buffer = new byte[512 * 256]; // 512 bytes per page, 256 pages on a 128k device
for (int j = 0; j < buffer_count; j += 8)
comport.Write(buffer, buffer_offset + j, 8);
如果您想知道为什么我一次发送8个字节,那是因为如果您将所有512个发送到一个Write()中,则它对任何页面都不起作用。发送少于512字节的数量,并且没有任何刷新或等待会改变这一点,但是当您进行下一次写入时,它将在开始时包含来自页面的大量随机字符。 SerialPort似乎被严重破坏......
无论如何,正如我所说,这适用于除了没有的每一页。 97.我尝试更改编码,因为MSDN建议字节数组将被编码,但它没有帮助。我尝试了Unicode(UTF16),UTF8和各种代码页。 Unicode将丢失的字节数从3减少到2。
System.Text.Encoding iso_8859_1 = System.Text.Encoding.GetEncoding("iso-8859-1");
comport.Encoding = iso_8859_1;
或
comport.Encoding = System.Text.Encoding.UTF8;
我也尝试用Write()一次发送一个字节,没有任何区别。
老实说,看起来SerialPort无法将原始字节发送到端口。当然不可能是这种情况。
好的,我试过了:
comport.Encoding = System.Text.Encoding.UTF8;
var page_buf = new byte[512];
for (int j = 0; j < 512; j++)
page_buf[j] = buffer[buffer_offset + j];
var tempstr = Encoding.UTF8.GetString(page_buf);
comport.Write(tempstr);
comport.Encoding = System.Text.Encoding.ASCII;
它修复了第97页但是打破了第2页。我不认为搞乱编码会起作用,我只需要将原始字节发送到端口。如果它有任何区别,这是一个USB串口。