目前共有3篇帖子。
串口傳入的溫度數據分次讀取程序
1樓 巨大八爪鱼 2017-2-6 16:33
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>

#define DSNEG (1 << 4)
#define DSERR (1 << 6)

char *getcode(unsigned char data)
{
    const char *list = "0123456789abcdef";
    static char code[5];
    strcpy(code, "0x??");
    code[2] = list[data >> 4];
    code[3] = list[data & 0x0f];
    return code;
}

int readtemp(int fd, unsigned char *buf, int len)
{
    int i, j, n;
    int cnt = 0;
    buf[0] = 0;
    for (i = 1; cnt < len; i++)
    {
        n = read(fd, buf + cnt, len - cnt);
        if (n == 0)
            break;
        printf("第%d次讀取的數據為: ", i);
        for (j = 0; j < n; j++)
        {
            printf("%s", getcode(buf[cnt + j]));
            if (j + 1 < n)
                putchar(' ');
            else
                putchar('\n');
        }
        cnt += n;
    }
    return cnt;
}

void decode(unsigned char *buf)
{
    double temp;
    if (buf[1] & DSERR)
    {
        perror("但溫度數據有誤!\n");
        return;
    }
    temp = buf[2] * 1.00 + buf[3] * 0.01;
    if (buf[1] & DSNEG)
        temp = -temp;
    printf("溫度值為: %.2lf\n", temp);
}

int main(void)
{
    unsigned char buf[4] = {0x83};
    int fd, n;
    struct termios t;
    
    fd = open("/dev/ttyUSB0", O_RDWR);
    if (fd == -1)
    {
        perror("打開串口失敗!\n");
        return 0;
    }
    
    if (tcgetattr(fd, &t) == 0)
    {
        write(fd, buf, 1);
        n = readtemp(fd, buf, sizeof(buf));
        
        if (n != sizeof(buf))
            printf("傳回的數據不完整,只讀取了%d位元組!\n", n);
        else if (buf[0] == 0x83)
        {
            printf("讀取溫度值成功!\n");
            decode(buf);
        }
        else
            printf("讀取溫度值失敗, 錯誤碼: %s\n", getcode(buf[0]));
    }
    else
        perror("獲取串口默認配置失敗!\n");
    
    close(fd);
    return 0;
}
2樓 巨大八爪鱼 2017-2-6 16:34
$ ./debug
第1次讀取的數據為: 0x83
第2次讀取的數據為: 0xaf
第3次讀取的數據為: 0x0e
第4次讀取的數據為: 0x51
讀取溫度值成功!
溫度值為: 14.81

3樓 巨大八爪鱼 2017-2-6 16:36
今天才發現溫度數據採集程序突然不工作了。硬體和串口線沒有任何問題,是上位機程序的問題。因為現在(可能是某次系統更新後)用read函數不能保證一次性能讀完所有數據,因此必須要採取多次讀取的方法消除故障。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
 
 
©2010-2024 Arslanbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。