Потеря данных при использовании метода Serial.Write - PullRequest
0 голосов
/ 27 мая 2019

Теперь я хотел бы использовать WinForms для разработки графического интерфейса для управления встроенной платой.

Между WinForm и встроенной платой используется последовательная связь.

В настоящее время результат чтения данных хороший.

Однако запись данных с помощью метода Serial.Write работала плохо. https://docs.microsoft.com/zh-tw/dotnet/api/system.io.ports.serialport.write?view=netframework-4.8

Некоторые символы не были получены доской. результат показан в следующем:

Reading Result

     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 для передачи нескольких байтов приведет к потере данных.

Однако это не имеет смысла ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...