Теперь я хотел бы использовать WinForms для разработки графического интерфейса для управления встроенной платой.
Между 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. Перед разработкой этого графического интерфейса я использовал Tera Term
для связи с доской, и чтение и запись работали хорошо.
Конфигурация:
- Получение: CR, кодирование с UTF8
- Передача: LF, кодирование с UTF8
Кто-нибудь выяснит, почему это произошло именно так?
Я решил эту проблему после того, как изменил процесс записи:
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
для передачи нескольких байтов приведет к потере данных.
Однако это не имеет смысла ...