现在,我想使用WinForms开发GUI来控制嵌入式板。
在WinForm和嵌入式板之间,利用串行通信。
当前,读取数据的结果很好。
但是,用Serial.Write
方法写入数据的效果不佳。
https://docs.microsoft.com/zh-tw/dotnet/api/system.io.ports.serialport.write?view=netframework-4.8
董事会未收到某些字符。 结果显示如下:
private void ButtonSendCommand_Click(object sender, EventArgs e)
{
byte[] txdata = Encoding.UTF8.GetBytes(TXTBoxCommand.Text);
OBCSerialPort.Write(txdata, 0, txdata.Length);
OBCSerialPort.Write(Environment.NewLine);
}
在我的嵌入式板上,我使用scanf
来获取命令并对其进行解码
scanf("%[^\n]%*c", cStr);
并具有解码功能:
void decode_context(char *str)
{
uint8_t i = 0;
uint8_t argc = 0; //number of argument
char *p = strtok(str, " ");
char *cBuf[MAX_INPUT_LEN];
command_t* pCase = 0;
struct cmd_context ctx;
// Split input string with space
while (p != NULL){
cBuf[i++] = p;
p = strtok (NULL, " ");
argc++;
}
if(argc < Max_ARGC){
// Duplicate arg & argc to command context
memcpy(ctx.arg, cBuf, sizeof(cBuf[0])*argc);
memcpy(&ctx.argc, &argc, sizeof(uint8_t));
// Linear serach for key of instruction
for(pCase = command
; pCase != command + sizeof(command) / sizeof(command[0])
; pCase++)
{
if(0 == strcmp(pCase->name, ctx.arg[0])) {
(*pCase->handler)(&ctx);
break;
}
if(pCase == command-1 + sizeof(command)/sizeof(command[0]))
printf("\n\r\t Not defined command:'%s' Please refer instruction set!\n", ctx.arg[0]);
}
}
else
printf("\n\r\t Error: too many arguments ! \n\r");
}
P.S。在开发此GUI之前,我已经使用Tera Term
与电路板进行通信,并且读写性能都很好。
配置是:
有人知道为什么会这样吗?
修改书写过程后,我已经解决了这个问题:
int index = 0;
byte[] txdata = Encoding.UTF8.GetBytes(TXTBoxCommand.Text);
while (index < txdata.Length)
{
OBCSerialPort.Write(txdata, index, 1);
index++;
if (index == txdata.Length)
OBCSerialPort.Write("\n");
}
对于我的嵌入式板,使用OBCSerialPort.Write
传输多个字节似乎会导致数据丢失。
但是,这没有意义...