串口字符转译(收发数据长度变长问题)

在串口数据收发时遇到数据长度不一致的问题,源于数据转义规则。串口发送的FD FE数据变为FD ED FD EE。数据转义能确保通信安全,防止帧头和帧尾的误识别。转义规则包括STX、ETX和ESC的转换,接收数据时需特殊处理0x2D字节。

问题:在测试串口数据收发过程中,发现在收发过程中串口和服务器的数据长度不一致,串口发送的FD FE数据变为了FD ED FD EE。使用透传的时候,数据收发长度是一样的。长时间不发数据时,其心跳包数据位FE

说明:

通过串口和服务端抓包发现,数据在串口端没有问题,但是在服务端抓包时发现它就变了,通过查找资料,了解到应该是数据转义导致收发数据长度变长。

一、为什么通信协议中需要加数据转义呢?

可以使得通信的内容更加安全可靠,可以收发不定长的数据帧。

### 在 Oracle 数据库中实现查询结果的数据字符转译 在 Oracle 数据库中,当需要对查询结果的数据集进行字符转译时,可以使用 `CONVERT` 函数或设置会话级别的字符集转换。以下是具体方法: #### 方法一:使用 `CONVERT` 函数 `CONVERT` 函数可以将字符串从一种字符集转换为另一种字符集[^1]。以下是一个示例: ```sql SELECT CONVERT(column_name, 'UTF8', 'WE8ISO8859P1') AS converted_column FROM table_name; ``` 上述代码中,`CONVERT` 函数将 `column_name` 列的值从 `WE8ISO8859P1` 字符集转换为 `UTF8` 字符集。如果目标字符集与源字符集不兼容,则可能会导致数据丢失或乱码。 #### 方法二:设置会话级别的字符集 通过更改会话的 NLS_CHARACTERSET 参数,可以在查询过程中临时调整字符集。以下是一个示例: ```sql ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN'; ALTER SESSION SET NLS_TERRITORY = 'AMERICA'; ALTER SESSION SET NLS_CHARACTERSET = 'AL32UTF8'; ``` 这些语句将当前会话的字符集设置为 `AL32UTF8`,从而影响后续查询的字符集处理逻辑[^2]。 #### 方法三:使用 `DBMS_LOB.CONVERTTODATA` 进行 LOB 数据转换 对于存储在 LOB 列中的数据,可以使用 `DBMS_LOB.CONVERTTODATA` 过程进行字符集转换。以下是一个示例: ```plsql DECLARE src_lob CLOB := '测试数据'; dest_lob CLOB := EMPTY_CLOB(); BEGIN DBMS_LOB.CREATETEMPORARY(dest_lob, TRUE); DBMS_LOB.CONVERTTODATA( dest_lob => dest_lob, amount => DBMS_LOB.GETLENGTH(src_lob), src_offset => 1, dest_offset => 1, blob_csid => NLS_CHARSET_ID('WE8ISO8859P1'), lang_context => 0, warning => 0 ); DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(dest_lob, 4000, 1)); END; ``` 此代码片段展示了如何将 LOB 数据从一个字符集转换为另一个字符集,并输出转换后的结果。 #### 注意事项 - 使用 `CONVERT` 函数时,确保目标字符集能够正确表示源字符集中的所有字符,否则可能导致数据丢失。 - 修改会话级别的字符集可能会影响其他操作的行为,因此建议仅在必要时使用。 - 对于大容量数据字符集转换,考虑性能问题,尽量在导入或导出阶段完成字符集统一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值