C语言UART通信(十六进制)

2024-02-02

我想向写入函数发送一个十六进制值。 (例如,0×90)。 这是因为需要通信的设备接收到的是十六进制数的命令。 未使用的变量在测试时出现,并注释为丢失十六进制值,稍后将被删除。 如何编写具有字符串以外的十六进制值的写入函数?

对于初学者, 请告诉我们如何通过读写函数交换十六进制值。

#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <time.h>
#include <pthread.h>

int main(void)
{
    int fd;
    fd=open("/dev/ttyHSL6", O_RDWR|O_NOCTTY );
    struct termios newtio;

    char buffer[2000];
    int bytes_read=0;
    char *data;
    //int *a=0x90;

    char *a="0X90";
    const int *num1;
    
    if (fd == -1)
    {
        printf("Error! in opening port");
        exit(-100);
    }

    memset(&newtio, 0, sizeof(struct termios));
    newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;

    newtio.c_iflag = IGNPAR;

    newtio.c_oflag = 0;
    newtio.c_lflag = 0;
    newtio.c_cc[VTIME] = 0; 
    newtio.c_cc[VMIN] = 1; 
    tcflush(fd, TCIFLUSH);

    tcsetattr(fd, TCSANOW, &newtio);
    data=malloc(sizeof(char)*140);
    while(1){
        const char *str ="0x91";
        
        //write(fd, str, strlen(str)+1);

        bytes_read = read(fd,buffer,sizeof(buffer));

        if (bytes_read > 0)
        {
            buffer[bytes_read]=0;
            printf("%s", buffer);
        }
        usleep(100000);

        
    }
    close(fd);
    return 0;
}

现在的进展:

我设置了发送和接收变量并使用unsigned char编译了代码,但出现了这样的错误。

./serial.c:48:10: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘unsigned char *’ [-Wformat=]
   printf("%x\n",str);

如果我使用%p,则不会出现编译错误,但是如您所知,打印的是地址值,因此与我想要的结果不同。我不知道该怎么做,因为我是初学者。

修改部分如下。

    while(1){
        //const char *str ="0x91";
        unsigned char str[13] = {0xA5,0x80,0x90,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBD};
        write(fd, str, strlen(str));
        printf("%x\n",str);
        bytes_read = read(fd,buffer,sizeof(buffer));

    //  printf("%x\n",*str);
        if (bytes_read > 0)
        {
            buffer[bytes_read]=0;
            

            printf("%p\n", buffer);
        }
        usleep(100000);

        //printf("%s\r\n",buffer);      

    }
    close(fd);
    return 0;

您只是想发送二进制而不是文本数据,但是,二进制数据不能以与文本字符串相同的方式处理,因为 0 (0x00) 是合法的二进制值,而它在 C 中充当字符串终止符。这就是为什么二进制数据协议通常在一个字节中具有长度指示符(如果消息可以具有可变长度)或特定的消息分隔符(消息开头和结尾处的唯一值,不能在消息数据中重复) 。

关于您的代码的指针: 尽可能初始化值,尤其是要存储字符串的数组,例如char buffer[2000] = {0}如果编译器允许的话memset(buffer, 0, sizeof(buffer);在使用它之前。

    unsigned char str[13] = {0xA5,0x80,0x90,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBD};

这里有一个隐式的强制转换signed int to an unsigned char对于您正在初始化数组的值,例如0x90 is an int默认情况下。

    write(fd, str, strlen(str));

正如所指出的0x00(null) 是一个合法的二进制值,但恰好是 C 中的文本字符串终止符,因此strlen(str)将返回 4,因为它需要0xA5, 0x80, 0x90, 0x08, 0x00作为您的字符串,包含 4 个数据字节和 1 个终止符。对于存储字符串的数组,必须留出一个额外的字节来放置空终止符。

相反,你应该使用类似的东西:

write(fd, str, sizeof(str)/sizeof(str[0]));

这将计算数组中的元素数量。作为sizeof将返回正在调整大小的项目占用的内存字节数(八位字节),我们还需要将其除以数组元素的大小以确定元素的数量。

A char将返回大小 1,int在 16 位处理器上编译时可以返回 2 的大小,如果在 32 位处理器上编译则返回 4 等。

最后,您需要转换正在打印的值,因此请尝试使用:(编辑:进行了代码更正)

unsigned char str[13] = {0xA5,0x80,0x90,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBD};

for (int i=0; i< sizeof(str)/sizeof(str[0]); i++) 
{ 
    printf("%X",(int)str[i]); 
} 
printf("\n"); 

会给

A58090800000000BD
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言UART通信(十六进制) 的相关文章

  • 具有可绑定属性的自定义视图未在 Xamarin.Forms SAP 上正确绑定

    我有一个复选框 应该触发按钮的 IsEnabled 事件 但不知何故 应该执行的命令永远不会正确绑定并因此执行 这是 CheckBox xaml cs 控件 中的可绑定属性 public static readonly BindablePr
  • 将 Stream 反序列化为 List 或任何其他类型

    尝试将流反序列化为List
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

    是否可以在一个 windows azure 小型计算实例中运行一堆 Web 应用程序 我正在考虑使用 Azure 作为放置一堆处于开发和非生产状态的项目 Web 应用程序 的地方 有些实际上已经被封存了 但我想在某个地方有一个活跃的实例 我
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 使用 AdHocWorkspace 会导致“不支持语言‘C#’”。

    在VS2015中使用Microsoft CodeAnalysis CSharp Workspaces的RC2 这段代码会抛出异常 var tree CSharpSyntaxTree ParseText var workspace new A
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代

随机推荐

  • R 和 scikit-learn 在逻辑回归分类任务中的比较

    我正在做 James Witten Hastie Tibshirani 2013 所著的 R 应用统计学习简介 一书中描述的逻辑回归 更具体地说 我将二元分类模型拟合到第 7 8 1 节中描述的 R 包 ISLR 中的 工资 数据集 预测变
  • 是否可以在 Visual Studio 中加载不匹配的符号?

    我有一个 Windows 小型转储 C 代码 和一个相应的 exe 文件 不幸的是 我没有完全匹配的 pdb 文件 但我确实有 pdb 其中包含在不同时间构建的完全相同的代码 在 Windbg 中 我可以使用 symopt 0x40 告诉它
  • 将双数四舍五入到十分位[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的 float 函数 https stackoverflow com questions 485525 round for float in c 好吧 假设我有电话号码8 47434 我想将其四
  • ts1206 装饰器在这里无效,Angular 2

    我开始编写 Angular 2 程序 但遇到了一个错误 ts1206 装饰器在这里无效 Component ts1206 decorators are not valid here selector my app moduleId modu
  • pandas 在重复 DataFrame.reset_index() 时崩溃

    这里有一个非常奇怪的错误 我正在使用 pandas 来合并多个数据帧 作为合并的一部分 我必须多次调用reset index 但是当我这样做时 它会在第二次或第三次使用 reset index 时意外崩溃 这是重现错误的最少代码 impor
  • 使用 google Sheets api 无需客户端登录

    我有一个从 Google 电子表格中获取数据的网站 我希望我的用户无需登录即可查看获取的数据 这可能吗 如何实现 为了获取和更新工作表数据 我只需要一个帐户 最好在服务器端登录 但是 我还没有看到任何不需要客户端登录的服务器端日志记录 以此
  • CORS - Facebook - 护照

    我正在尝试在我的 Nodejs Angular Express Passport 应用程序中通过 Facebook 实现 OAUTH 登录 但我对此很挣扎 我仍然收到 CORS 错误 XMLHttpRequest 已被 CORS 策略阻止
  • 使用 Spark 和 Java 进行分层采样

    我想确保我正在对数据的分层样本进行训练 Spark 2 1 及更早版本似乎支持这一点JavaPairRDD sampleByKey and JavaPairRDD sampleByKeyExact 正如所解释的here https spar
  • NextJS api 路由中的文件路径无法解析

    我正在尝试解析文件路径NextJS https nextjs org 我明白那个API路线 https nextjs org docs api routes introduction部署到 Vercel 时 工作方式略有不同 为了创建文件的
  • 使用子查询的 Sqlite 更新查询

    我必须更新表 test test 列 testconsent id 与表的 id 值test groupedconsent 哪里的patient id in test test and patient id in test groupedc
  • 使用 __setattr__ 和 __getattr__ 与 __slots__ 进行委托,而不会触发无限递归

    class A slots a def init self gt None self a 1 class B1 slots b def init self b gt None self b b def getattr self k retu
  • 如何在 MySQL 中获取当前日期和时间?

    是否有像 DATETIME 这样的值或命令可以在手动查询中使用来插入当前日期和时间 INSERT INTO servers server name online status exchange disk space network shar
  • WPF ListView/GridView 绑定

    我正在尝试制作一个简单的 VS 2017 扩展 它获取一个对象并显示它 我有数据返回并在文本框中显示 json 所以我知道数据正确返回 但由于某种原因 gv 仅显示单词 id 两次 因为它们是数据集中的两条记录 我已经尝试了很多事情 但我却
  • 动态加载字体 html jquery

    我正在开发一个允许用户输入一些文本并将其拖动到适当位置等的网站 我已经达到了我想提供字体选择的程度 我可以动态加载字体而不是一次性加载所有字体吗 例如 用户输入文本并选择使用 通用字体 1 是否可以使用 jquery 加载该字体 这样我就可
  • 如何使用 puppeteer 使用 x/y 坐标单击元素?

    我一直在尝试弄清楚如何使用 puppeteer 中的 x 和 y 坐标单击页面上的按钮 但我无法让它工作 这就是我目前正在使用的 await page mouse click x y button left 没有发生错误 它只是没有单击任何
  • 数据表中的自定义分页

    我有一个网络应用程序 在其中我从数据库获取数据并显示在数据表中 我在执行此操作时遇到问题 因为我获取的数据行太多 200 000 所以当我查询类似的东西时select from table name 我的应用程序卡住了 有没有办法用 Jav
  • Django UserCreationForm 自定义字段

    我正在尝试创建用户注册表单并添加一些自定义字段 为此 我对 UserCretionForm 进行了子类化并添加了字段 如 django 文档中所示 然后我根据这个表单创建了基于函数的视图和模板 现在 我可以成功创建用户 并且该用户已按预期添
  • jQuery - 使用 .getHours() 方法将 1-24 小时更改为 1-12 小时?

    Fiddle http jsfiddle net bnsex 1 http jsfiddle net bnsex 1 我想在这段代码中使用 12 小时制 document ready function setInterval functio
  • Java byte[] 到字符串转换输出字节

    在我的代码中 我通过互联网发送一个编码为字节数组的 txt 文件 然后在另一端将消息转换回并显示它 问题是 当我尝试显示它时 它总是显示为 B 1ef9f1d 或 B 1764be1 等 这是接收数据的地方 private void par
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过