使用 libserialport 来实现串口通信(更新)
在之前的文章中提到了使用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);
}
评论已关闭