vc++ 6.0串口通讯

发布于 2024-07-09 21:06:24 字数 159 浏览 9 评论 0原文

在 vc++ 中,我使用 MScomm 进行串行通信, 我收到这种格式的数据02120812550006050.0, 我不知道如何阅读它,它的格式是什么, 开始的起始帧和最后的结束文件,仍然是我不知道的。

编辑1:

它包含日期时间和数据我如何分开这个

In vc++ i am using MScomm for serial communication,
i received data in this format 02120812550006050.0,
i am not gettng how to read this ,in which format it is,
begning starting frame and at the end ending file, remaing i dont know.

EDIT 1:

it contains date time and data how i can seperate this one

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

π浅易 2024-07-16 21:06:24

有趣的字符是指示记录开始、记录结束、字段分隔符等内容的标记。 在不了解实际协议的情况下,很难说清楚。

数据就容易多了。

在 000f 和 0002 标记之间有一个日期/时间字段,2008 年 12 月 2 日,12:55:00。

在 0002 和 0003 标记之间,它看起来像一个简单的浮点数,可以是美元值或任何其他值,这取决于链接另一端的内容。

为了将其分开,我假设您已将其读入某种可变字符数组中。 只需查找标记并提取它们之间的字段即可。

日期/时间是固定大小的,值也可能是固定大小的(因为它有一个前导 0),所以你可能只使用 memcpy 从缓冲区中提取你需要的信息,以 null 终止它们,将值转换为漂浮,瞧。

如果它是固定格式,您可以使用类似:

static void extract (char *buff, char *date, char *time, float *val) {
    // format is "\x01\x0fDDMMYYhhmmss\x02vvvvvvv\x03\x04"
    char temp[8];
    memcpy (date, buff +  2, 6); date[6] = '\0';
    memcpy (time, buff +  8, 6); time[6] = '\0';
    memcpy (temp, buff + 15, 7); temp[7] = '\0';
    *val = atof (temp);
}

并调用它:

char buff[26]; // must be pre-filled before calling extract()
char dt[8];
char tm[8];
float val;
extract (buffer, dt, tm, &val);

如果不是固定格式,您只需编写代码来检测字段分隔符的位置并提取它们之间的内容。

The funny characters are markers indicating things like record start, record end, field separator and so on. Without knowing the actual protocol, it's a little hard to tell.

The data is a lot easier.

Between the 000f and 0002 markers you have a date/time field, 2nd of December 2008, 12:55:00.

Between 0002 and 0003 marker, it looks like a simple float which could be a dollar value or anytrhing really, it depends on what's at the other end of the link.

To separate it, I'm assuming you've read it into a variable character array of some sort. Just look for the markers and extract the fields in between them.

The date/time is fixed size and the value probably is as well (since it has a leading 0), so you could probably just use memcpy's to pull out the information you need from the buffer, null terminate them, convert the value to a float, and voila.

If it is fixed format, you can use something like:

static void extract (char *buff, char *date, char *time, float *val) {
    // format is "\x01\x0fDDMMYYhhmmss\x02vvvvvvv\x03\x04"
    char temp[8];
    memcpy (date, buff +  2, 6); date[6] = '\0';
    memcpy (time, buff +  8, 6); time[6] = '\0';
    memcpy (temp, buff + 15, 7); temp[7] = '\0';
    *val = atof (temp);
}

and call it with:

char buff[26]; // must be pre-filled before calling extract()
char dt[8];
char tm[8];
float val;
extract (buffer, dt, tm, &val);

If not fixed format, you just have to write code to detect the positions of the field separators and extract what's between them.

骄傲 2024-07-16 21:06:24

除非您知道您正在与什么通信以及它如何与您通信,否则您不太可能弄清楚这一点。 (提示——您可以尝试告诉我们)

It is unlikely that you will figure it out unless you know what you are communicating with and how it communicates with you. (hint -- you can try telling us)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文