使用C

时间:2015-11-12 14:42:31

标签: c serial-port

我正在尝试从rs232 com端口正确读取,这是从卡车重量等级获取信息。我知道体重秤每秒发出的重量大约是其重量的10倍,并且它不需要任何输入,只是不断发送它。

我已经可以阅读重量,但问题是我无法读取体重秤发送的文本的单行。所以我希望有人可能会对C代码进行整理,以便它读取一行。

顺便说一下,我找到了源代码here,它不是我的。

#include <stdlib.h>
#include <stdio.h>

#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif

#include "rs232.h"



int main()
{
  int i, n,
      cport_nr=0,        /* /dev/ttyS0 (COM1 on windows) */
      bdrate=9600;       /* 9600 baud */

      unsigned char buf[4096];

      char mode[]={'8','N','1',0};


      if(RS232_OpenComport(cport_nr, bdrate, mode))
      {
printf("Can not open comport\n");

return(0);
}

while(1)
{
  n = RS232_PollComport(cport_nr, buf, 4095);

  if(n > 0)
  {
    buf[n] = 0;   /* always put a "null" at the end of a string! */

    for(i=0; i < n; i++)
    {
      if(buf[i] < 32)  /* replace unreadable control-codes by dots */
      {
        buf[i] = '.';
      }
    }

    printf("received %i bytes: %s\n", n, (char *)buf);
  }

  #ifdef _WIN32
      Sleep(100);
  #else
      usleep(100000);  /* sleep for 100 milliSeconds */
  #endif
  }

  return(0);
}

所以,我想在这里完成的是这个C程序应该从体重秤读取一行,输出然后退出。这条线应该标记为&#39;使用分隔符,例如EOL##或其他内容。提前致谢

EDIT1:   - 每个尺度的样本输出 -

1st:
000000.,001000001,99
000000.,001000001,99
000000.,001000001,99
000000.,001000001,99
000000.,001000001,99

2nd:
+      0.0
+      0.0
+      0.0
+      0.0
+      0.0

3rd:
+       0
+       0
+       0
+       0
+       0
+       0

EDIT2: 好的,我找到了rs232协议手册。 这是比例协议的对应表

   Data  |  ascii code  |  Description
    SP          20h        white space
    D6          0-9        1st weight digit
    D5          0-9        2nd "
    D4          0-9        3rd
    PD          2Eh        decimal mark
    D3          0-9        4th weight digit
    D2          0-9        5th "
    D1          0-9        6th "
    CR          0Dh        carriage return
    LF          0Ah        line feed

1 个答案:

答案 0 :(得分:0)

关键问题是数据以异步方式到达代码搜索它时 - 数据到达时 - 代码正在查找与到达没有时间关系的数据。

因此,当代码搜索RS232_PollComport():0的消息时,可能会产生部分,完整或完整和部分消息。

取决于效果目标的各种方法:让我们尝试一个简单的方法:寻找' '并继续打印直到'\n'

void Service_Port(int cport_nr) {
  char *front_delimiter = "<";
  char *end_delimiter = ">";
  int start_of_frame = ' ';
  int end_of_frame = '\n';
  int start_of_frame_found = 0;
  for (;;) {
    char buf[1];
    int n = RS232_PollComport(cport_nr, buf, sizeof buf);
    if (n > 0) {
      if (buf[0] == start_of_frame) {
        fputs(front_delimiter, stdout);
        start_of_frame_found = 1;
      }
      if (start_of_frame_found) {
        fputc(buf[0], stdout);
        if (buf[0] == end_of_frame) {
          fputs(end_delimiter, stdout);
          return;
        }
      }
    }
  } // end for
}

上面花了很多的时间循环并等待'\n'

可能进行各种改进,但这符合OP的目标

  

从体重秤读取一行,输出然后退出......该行应标记为&#39;与分隔符