C语言对 通讯模组 物理层(PHY)数据提取 方法

物联网模组物理层数据混合在一起怎么搞提取

使用 C 语言提取你提供的所有类型数据字段的示例代码,整体思路是通过字符串处理函数对不同模块的字符串分别进行分割和解析,提取出各个参数及其对应的值

举例CAT1模组的物理层数据:

c 复制代码
+ECSTATUS: PHY, DlEarfcn:1850, UlEarfcn:19850, PCI:1, Band:3, RSRP:-95, RSRQ:-10, SNR:9, DlBler:0/100, UlBler:0/100,                  DataInactTimerS:60, RetxBSRTimerP:320, TAvalue:20, TxPower:14, MaxTxPower:23, rxTime:1410, txTime:70
+ECSTATUS: L2, SrbNum:2, DrbNum:1
+ECSTATUS: RRC, State:"CONNECTED", TAC:30559, CellId:125637176, DRX:1280
+ECSTATUS: EMM, EmmState:"REG", EmmMode:"CONNECTED", PTWMs:0, EDRXPeriodMs:0, PsmExT3412TimerS:4294967295, T3324TimerS:65535, T3346RemainTimeS:0
+ECSTATUS: PLMN, PlmnState:"SELECTED", PlmnType:"EHPLMN", SelectPlmn:"0x460,0xf001"
+ECSTATUS: ESM, ActBearerNum:1, APN:"sxzcat1.MNC006.MCC460.GPRS", IPv4:"10.198.148.55"
+ECSTATUS: CCM, Cfun:1, IMSI:"460065244629186"

实际函数实现:

c 复制代码
//字符串分割提取
void extractRRCData(char *rrcData) 
{
    	char *token;           //引入开头
		char *delim = ", ";  //通过此delim 分割的字符
    
		token = strtok(rrcData, delim);//获取开头
    
		// 跳过开头的 "+ECSTATUS: RRC"
    	token = strtok(NULL, delim);//跳过
    
		while (token!= NULL) 
		{
        char paramName[100];
        char paramValue[100];
        sscanf(token, "%[^:]:%s", paramName, paramValue);//提取参数名称 参数
        printf("%s: %s\n", paramName, paramValue);//打印参数名称  打印参数
        token = strtok(NULL, delim);//返回下一段索引
    }
}

各个提取函数的逻辑:

对于每个ext

ractXXXData函数(如extractPhyData、extractL2Data等),首先使用strtok函数按照指定的分隔符(, )对传入的对应模块字符串进行分割。

跳过开头表示模块名称的那部分字符串(如+ECSTATUS: PHY),然后通过sscanf函数按照%[^:]:%s的格式来解析出参数名和参数值,并进行打印输出,输出时会加上对应模块的前缀(如物理层 -、层2 -等)方便区分查看。

main函数中的操作:

在main函数里定义了各个模块对应的原始字符串数据,然后依次调用各个提取函数来提取并输出相应模块的所有数据字段内容。

实际效果

c 复制代码
+ECSTATUS: PHY, DlEarfcn:1506, UlEarfcn:19506, PCI:83, Band:3, RSRP:-97, RSRQ:-11, SNR:4, DlBler:0/100, UlBler:0/100,                  DataInactTimerS:0, RetxBSRTimerP:0, TAvalue:-1, TxPower:-128, MaxTxPower:23, rxTime:2079, txTime:189
+ECSTATUS: L2, SrbNum:0, DrbNum:0
+ECSTATUS: RRC, State:"IDLE", TAC:30559, CellId:117016381, DRX:1280
+ECSTATUS: EMM, EmmState:"REG", EmmMode:"IDLE", PTWMs:0, EDRXPeriodMs:0, PsmExT3412TimerS:4294967295, T3324TimerS:65535, T3346RemainTimeS:0
+ECSTATUS: PLMN, PlmnState:"SELECTED", PlmnType:"EHPLMN", SelectPlmn:"0x460,0xf001"
+ECSTATUS: ESM, ActBearerNum:1, APN:"sxzcat1.MNC006.MCC460.GPRS", IPv4:"10.74.206.168"
+ECSTATUS: CCM, Cfun:1, IMSI:"460065244629186"

OK
PHY: 
DlEarfcn: 1506
UlEarfcn: 19506
PCI: 83
Band: 3
RSRP: -97
RSRQ: -11
SNR: 4
DlBler: 0/100
UlBler: 0/100
DataInactTimerS: 0
RetxBSRTimerP: 0
TAvalue: -1
TxPower: -128
MaxTxPower: 23
rxTime: 2079
txTime: 189
L2: 189
SrbNum: 0
DrbNum: 0
RRC: 0
State: "IDLE"
TAC: 30559
CellId: 117016381
DRX: 1280
EMM: 1280
EmmState: "REG"
EmmMode: "IDLE"
PTWMs: 0
EDRXPeriodMs: 0
PsmExT3412TimerS: 4294967295
T3324TimerS: 65535
T3346RemainTimeS: 0
PLMN: 0
PlmnState: "SELECTED"
PlmnType: "EHPLMN"
SelectPlmn: "0x460
0xf001"
+ECSTATUS: "0x460
ESM: "0x460
ActBearerNum: 1
APN: "sxzcat1.MNC006.MCC460.GPRS"
IPv4: "10.74.206.168"
CCM: "10.74.206.168"
Cfun: 1
IMSI: "460065244629186"
相关推荐
weixin_472339462 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击2 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue4 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
m0_555762904 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
学不动CV了5 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
浪裡遊5 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
lzb_kkk6 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼6 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
猫猫的小茶馆6 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
简佐义的博客7 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang