[c]解析类RFC2217协议
基于chatGPT答案
RFC 2217协议
RFC 2217 是一种远程串行端口协议,也称为 "COM port control protocol"。它定义了在客户端和服务器之间通过网络连接访问串行端口设备的标准通信协议。该协议可以允许客户端通过网络连接来访问串行设备,就像直接连接到本地串行端口一样。RFC 2217 不仅支持数据传输,还支持对串口线路控制信号(如 DTR、RTS 等)进行远程控制。RFC 2217 协议已被广泛采用,并且是自由开放的标准协议。
类RFC2217协议
RFC2217是一个通过以太网即时修改设备串口参数的一个标准协议,本设备支持一个类似RFC2217的协议,不是标准RFC2217,实现同样的功能,但是协议更简单。
RFC2217协议说明
协议长度为8个字节,具体协议内容如下,举例的数值为HEX格式:
来自 USR-C322配置类 RFC2217 自动波特率功能
RFC2217参数设置表
RFC2217参数设置
115200,N,8,1 55 AA 55 01 C2 00 83 46
115200,ODD,8,1 55 AA 55 01 C2 00 8B 4E
115200,EVEN,8,1 55 AA 55 01 C2 00 9B 5E
115200,N,7,1 55 AA 55 01 C2 00 82 45
115200,N,6,1 55 AA 55 01 C2 00 81 44
115200,N,8,1 55 AA 55 01 C2 00 83 46
115200,N,5,1 55 AA 55 01 C2 00 80 43
115200,N,8,2 55 AA 55 01 C2 00 87 4A
38400,N,8,1 55 AA 55 00 E1 00 83 64
19200,N,8,1 55 AA 55 00 4B 00 83 CE
57600,N,8,1 55 AA 55 00 E1 00 83 64
14400,N,8,1 55 AA 55 00 38 40 83 FB
9600,N,8,1 55 AA 55 00 25 80 83 28
4800,N,8,1 55 AA 55 00 12 C0 83 55
2400,N,8,1 55 AA 55 00 09 60 83 EC
1200,N,8,1 55 AA 55 00 04 B0 83 37
600,N,8,1 55 AA 55 00 02 58 83 DD
230400,N,8,1 55 AA 55 03 84 00 83 OA
460800,N,8,1 55 AA 55 07 08 00 83 92
思路
以下是可以用于解析 RFC 2217 协议的一些开源代码:
1. libtelnet:一个 C 语言实现的库,包括了 RFC 2217 的支持。可以通过该库轻松地实现远程串行端口连接。
2. ser2net:一个类似于 telnet 服务器的软件,可以将本地串口设备暴露为网络服务。它支持多种协议,包括 RFC 2217。
3. rfc2217:这是一个简单的命令行工具,用于建立基于 RFC 2217 的远程串行端口连接。它也是用 C 语言编写的,并且提供了源代码。
这些工具都提供了用于解析 RFC 2217 指令的 C 语言代码,您可以参考它们的源代码来编写您自己的RFC 2217指令解析程序。
demo
下面是一个简单的C语言程序,用于解析RFC2217协议的指令“55 AA 55 01 C2 00 83 46”:
#include <stdio.h>
int main() {
unsigned char data[] = {0x55, 0xAA, 0x55, 0x01, 0xC2, 0x00, 0x83, 0x46};
int i;
printf("RFC2217 Command:\n");
for(i = 0; i < sizeof(data); i++) {
printf("%02X ", data[i]);
}
printf("\n");
// 解析指令
if(data[0] == 0x55 && data[1] == 0xAA && data[2] == 0x55 && data[3] == 0x01) {
int baudrate = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
printf("Baudrate: %d\n", baudrate);
}
else {
printf("Invalid Command.\n");
}
return 0;
}
程序首先将指令存储在一个无符号字符数组中。然后,它打印出指令的十六进制表示形式,以便我们可以检查它是否正确。接下来,它检查指令的前四个字节是否是RFC2217协议指令的标志(0x55 0xAA 0x55 0x01)。如果是,它将指令中的下一个四个字节解释为一个32位整数,表示波特率。最后,程序打印出波特率,并结束执行。如果指令不是RFC2217协议指令,程序将打印出“Invalid Command.”的错误信息。
解析用到的函数
memmem() 函数
memmem() 函数是 C 标准库中的一个函数,用于在内存块中查找一个子串。它的函数声明如下:
void *memmem(const void *haystack, size_t haystacklen,
const void *needle, size_t needlelen);
该函数的参数含义如下:
haystack:指向要搜索的内存块的起始地址。
haystacklen:要搜索的内存块的长度(单位:字节)。
needle:指向要查找的子串的起始地址。
needlelen:要查找的子串的长度(单位:字节)。
该函数返回一个指向第一次出现子串的地址的指针,或者返回 NULL,如果没有找到子串则返回 NULL。
例如,以下代码将在一个内存块中查找一个特定的子串,并返回其地址:
const char* buf = "hello world";
size_t len = strlen(buf);
const char* sub = "world";
size_t sublen = strlen(sub);
const char* result = memmem(buf, len, sub, sublen);
if (result) {
printf("Found substring at position %ld.\n", result - buf);
} else {
printf("Substring not found.\n");
}
在上面的示例中,我们使用 memmem() 函数在一个字符串中查找另一个子串。在实际使用时,您可以根据需要修改参数类型和数据源。注意,该函数仅适用于查找较小的子串,因为在大型内存块中查找长子串可能会很慢。
原文地址:https://www.cnblogs.com/dysonnnn/p/17238558.html
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[上篇]
- AngularJS in Action读书笔记3——走近Services
- 有了这些无人驾驶的汽车,未来还需要考驾照吗?
- 并发与实例上下文模式: WCF服务在不同实例上下文模式下具有怎样的并发表现
- AngularJS in Action读书笔记4(实战篇)——创建Statistic模块
- Effective Deep Memory Networks for Relation Extraction
- ConcurrencyMode.Multiple模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[上篇]
- WCF技术剖析之二十一:WCF基本异常处理模式[下篇]
- AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示
- WCF中并发(Concurrency)与限流(Throttling)体系深入解析系列[共7篇]
- AngularJS in Action读书笔记6(实战篇)——bug hunting
- FreeMarker模板开发指南知识点梳理
- WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
- WCF如何克服HTTP传输协议的局限提供对不同消息传输模式的实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SSM 单体框架 - 教育平台后台管理系统:接口文档
- java学习应用篇|使用环境变量做一些工具
- 【Java8新特性】06 新的日期和时间:LocalDate LocalTime LocalDateTime
- UNSAFE和Java 内存布局
- 【玩转Redis面试第1讲】Redis数据结构和常用命令速记
- SSM 单体框架 - 教育平台后台管理系统:课程模块
- 【玩转Redis面试第2讲】面试官再问Redis事务把这篇文章扔给他
- SSM 单体框架 - 教育平台后台管理系统:Maven 进阶使用
- SSM 单体框架 - 教育平台后台管理系统:广告和用户模块开发
- 杀死进程
- SSM 单体框架 - 教育平台后台管理系统:权限模块开发
- 版本控制系统 - GIT
- Spring Cloud Gateway 读取、修改请求体(解决request body内容被截断)
- SimpleTuning
- Nginx 配置