在之前的文章中提到了使用libserialport库通过串口与传感器通信。通过C语言的strtoull()函数:将字符串转换成unsigned long long(无符号长整型数)将01 03 00 00 00 01 84 0A字符串转换成无符号长整型数

/*
将 string 转换成 unsigned long 数据
*/
unsigned long long value = strtoul("0A84010000000301",NULL,16);
unsigned long long *data = &value;
int size = sizeof(value);

但是由于unsigned long long类型的范围是 0 到 18,446,744,073,709,551,615,转换成十六进制就是FFFFFFFFFFFFFFFF,这样就仅限于读取1个数量的寄存器了,如果你要读取多个寄存器,那么返回的数据肯定是大于FFFFFFFFFFFFFFFF的。

而且使用上述方式输入输出的数据都是高位在前低位在后,正常情况应该是010300000001840A

后来与厂家的一位技术人员沟通后得知,可以定义一个uint8_t数组,把要发送的数据装载到数组中去

uint8_t input_data[] = {0x01,0x03,0x04,0x01,0xB5,0x00,0xB9,0x2B,0x9B};
uint8_t * p_in_data = input_data;

然后直接将指针p_in_data通过libserialport中的函数发送到串口去。接收数据的时候也先定义一个uint8_t *point指针来存放数据,最后再转换成十六进制的数据

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

int main(void)
{
    uint8_t input_data[] = {0x01,0x03,0x04,0x01,0xB5,0x00,0xB9,0x2B,0x9B};
    uint8_t * p_in_data = input_data;
    size_t size = sizeof(input_data);

    for (size_t i = 0; i < size; i++)
    {
        printf("0x%02x, ", p_in_data[i]);
    }

    printf("\n");

    return 0;
}

另外附上之前在V2EX上提问的将string转成16进制的方法

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

/* unsigned long long to string */
char * ulltostr(unsigned long long value, char * ptr, int base);

int main(void)
{    
    char var[] = "0A84010000000301";    
    unsigned long long value = strtoull(var, NULL, 16);   
    
    printf("value is %llu\n", value);    
    
    int size = sizeof(var);
    // 申请堆内存
    char * str = malloc(size);    
    ulltostr(value, str, 16);

    printf("Received '%s'\n",str);
    // 释放内存
    free(str);

    return 0;
}

/* unsigned long long to string */
char* ulltostr(unsigned long long value, char * ptr, int base)
{
    unsigned long long t = 0, res = 0;
    unsigned long long tmp = value;
    int count = 0;

    if (NULL == ptr)
    {
        return NULL;
    }

    if (tmp == 0)
    {
        count++;
    }

    while (tmp > 0)
    {
        tmp = tmp / base;
        count++;
    }

    ptr += count;

    *ptr = '\0';

    do
    {
        res = value - base * (t = value / base);
        if (res < 10)
        {
            *--ptr = '0' + res;
        }
        else if ((res >= 10) && (res < 16))
        {
            *--ptr = 'A' - 10 + res;
        }
    } while ((value = t) != 0);

    return(ptr);
}

标签: none

评论已关闭