Как добавить и отобразить часы, минуты, секунды данных, взятых из последовательного порта с программированием на C - PullRequest
0 голосов
/ 11 ноября 2019

Я взял данные о температуре от последовательного порта Arduino. Данные о температуре, поступающие с последовательного монитора Arduino:

21.48
21.97
21.48
21.00
21.97
21.97

Используя программу C для считывания последовательного порта, как показано ниже, код:

char TempChar;
DWORD NoBytesRead;
do{
    ReadFile(hComm,&TempChar,sizeof(TempChar),&NoBytesRead,NULL);
    printf("%c",TempChar);                            }
while(!kbhit());

Тогда это будет выглядеть следующим образом.

21.48
21.97
21.48
21.00
21.97
21.97

Теперь я хочу добавить и отобразить часы, минуты и секунды, используя программу c, как показано ниже:

char TempChar;
DWORD NoBytesRead;

SYSTEMTIME str_t;
GetSystemTime(&str_t);

do{
   ReadFile(hComm,&TempChar,sizeof(TempChar),&NoBytesRead,NULL);
    printf("%c, %d:%d:%d ",TempChar,str_t.wHour+7,str_t.wMinute,str_t.wSecond);
 }while(!kbhit());

, но результат такой:

, 18:9:38  1, 18:9:38 ., 18:9:38 ., 18:9:38 0, 18:9:38 0, 18:9:38
, 18:9:38 2, 18:9:38 1, 18:9:38 ., 18:9:38 0, 18:9:38 0, 18:9:38
, 18:9:38 2, 18:9:38 1, 18:9:38 ., 18:9:38 0, 18:9:38 0, 18:9:38

Я действительно хочу, чтобы результат был

21.48,18:9:38
21.97,18:9:38
21.48,18:9:38
21.00,18:9:38
21.97,18:9:38
21.97,18:9:38

Что я должен исправить из кода программы на языке C?

Ответы [ 3 ]

2 голосов
/ 11 ноября 2019

Вы читаете данные о температуре символ за символом. Таким образом, в этом потоке символов необходимо определить границы каждого пакета данных. Очевидно, что в нем содержатся символы разрыва строки, поэтому вам необходимо их обнаружить:

if(tempChar == '\n')
{
    // print separator and date/time
}
printf("%c", TempChar)

Теперь зависит от того, какой разделитель строк используется, выше работает с \n, если у вас \r\n или только \r вам нужно настроить ...

Кажется, что в ваших данных есть разрыв строки, поэтому вам может потребоваться специальная обработка для самого первого переноса строки.

1 голос
/ 11 ноября 2019

Эта ошибка возникает из-за того, как вы написали оператор печати. ​​

printf("%c, %d:%d:%d ",TempChar,str_t.wHour+7,str_t.wMinute,str_t.wSecond);

Итак, здесь TempChar хранит текущее значение символа, которое печатается на каждом символе ваших временных данных. Поэтому сначала напечатайте все ваши временные данные, а затем напечатайте дату.

do{
   ReadFile(hComm,&TempChar,sizeof(TempChar),&NoBytesRead,NULL);
   if(TempChar!='\n'){printf("%c",TempChar);}
   else{
        printf(", %d:%d:%d \n",str_t.wHour+7,str_t.wMinute,str_t.wSecond);}
}while(!kbhit());
1 голос
/ 11 ноября 2019

Значит, Arduino отправляет новую строку? Затем соберите символы, которые вы прочитали, в строку и отобразите (со временем), когда вы прочитали новую строку.

...