Serial.Write方法期间的数据丢失

时间:2019-05-27 13:32:50

标签: c# c winforms serial-port

现在,我想使用WinForms开发GUI来控制嵌入式板。

在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。在开发此GUI之前,我已经使用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传输多个字节似乎会导致数据丢失。

但是,这没有意义...

0 个答案:

没有答案