QT串列埠傳送結果比預期多位元組問題

2021-10-01 19:50:28 字數 2081 閱讀 5030

俺前兩天犯了個錯誤,怪自己不認真,乙個小問題鼓搗乙個星期才發現原因所在。網上對這個型別錯誤描述比較少(ps:可能太low了,大家不屑於描述,見笑了哈~),這裡記一下,給後來者提個醒,也給自己立個flag。

多出了啥子呢?我很納悶。當時資料**是從二進位制檔案獲取的,讀出來,然後轉存到qbytearra。為了鎖定問題,就減小讀取檔案長度,找到多出來的位元組。嗯,找到了,是「0a」。

qtextcodec::setcodecforlocale(qtextcodec::codecforname("gb2312"));

readdataarray = binfile->read(packhead[packlen].value);

windows會在檔案末尾加個/r/n,轉換成16進製制,就是0d 0a,每個0d前面都多了乙個0d,好不奇怪呀。二進位制檔案裡面可不管這些有的沒的,因為.bin檔案裡面是資料呀,0d和0a都可能是它本身的資料。再仔細檢視,發現單獨的0a也會在前面加個0d。這。。。

俺找了個別人家的qt串列埠除錯助手,看了原始碼,好像很簡單呀,可是傳送一切正常。於是就開始qt串列埠配置的一系列資訊,查詢是否配置原因。後來就發現了這貨:

serialport->settextmodeenabled(true);
這裡有個settextmodeenabled,別人都沒有,就俺的有。趕緊去查查幹啥的。qt幫助裡是這麼說的:

void qiodevice::settextmodeenabled(bool enabled)

if enabled is true, this function sets the text flag on the device; otherwise the text flag is removed. this feature is useful for classes that provide custom end-of-line handling on a qiodevice.

the io device should be opened before calling this function.

尷尬不?

本來正常的串列埠**,傳送的是「00 02 0d 0a」,收到的真的多了乙個0d。

00 02 0d 0d 0a[2019-12-30 05:08:34.742]

00 02 0d 0d 0a[2019-12-30 05:08:34.912]

00 02 0d 0d 0a[2019-12-30 05:08:35.108]

00 02 0d 0d 0a[2019-12-30 05:08:35.305]

00 02 0d 0d 0a[2019-12-30 05:08:35.486]

00 02 0d 0d 0a[2019-12-30 05:08:35.678]

00 02 0d 0d 0a[2019-12-30 05:08:35.860]

00 02 0d 0d 0a[2019-12-30 05:08:36.041]

00 02 0d 0d 0a[2019-12-30 05:08:36.222]

00 02 0d 0d 0a[2019-12-30 05:08:36.393]

00 02 0d 0d 0a[2019-12-30 05:08:36.586]

00 02 0d 0d 0a[2019-12-30 05:08:36.780]

00 02 0d 0d 0a[2019-12-30 05:08:36.958]

00 02 0d 0d 0a[2019-12-30 05:08:37.150]

00 02 0d 0d 0a[2019-12-30 05:08:37.342]

00 02 0d 0d 0a[2019-12-30 05:08:37.523]

00 02 0d 0d 0a[2019-12-30 05:08:37.716]

00 02 0d 0d 0a[2019-12-30 05:08:37.896]

00 02 0d 0d 0a[2019-12-30 05:08:38.089]

00 02 0d 0d 0a[2019-12-30 05:08:38.572]

settextmodeenabled(true)意思就是裝置以text模式開啟,在讀取時,行終止符被轉換成\n,所以會導致傳送問題。

Qt中串列埠傳送HEX資料

在lineedit輸入資料的型別是qstring型別,以往我在傳送的時候是ascii方式傳送,這會兒突然遇到乙個是十六進製制傳送 接受的下位機,就需要將qstring 轉化為十六進製制,本來直接用tohex進行轉化,但考慮到在輸入的的時候有間隔符之類的,我就寫了個轉化的函式 以下是轉化單個字元的函式...

Qt模擬串列埠 tcp連線傳送資料

上一節已經基本上完成了qt介面的基本布局,下面就是後台資料的傳送和接收了,前面說了,qt和uc os 互動使用的方式是tcp 為啥要用tcp,而不使用別的呢,udp 按道理udp是最好的,不用連線,想發就發,不用管埠。但是,qt這個鬼,他封裝的udp函式不支援伺服器下發資料,也就是udp的伺服器不能...

STM32 HAL庫串列埠傳送多位元組資料

串列埠傳送16位元組資料 int16 t motorencoder uint8 t low,high high uint8 t motorencoder 8 low uint8 t motorencoder 0xff hal uart transmit huart1 low,1,0xff hal u...