1. 程式人生 > >linux串列埠收發資料不對(由於流控等設定不對導致)

linux串列埠收發資料不對(由於流控等設定不對導致)

最近一個專案使用了嵌入式linxu串列埠通訊,由於通訊使用的是2進位制資料,經常出現通訊校驗失敗,資料幀大小沒問題,就是校驗出錯

c_iflag引數表

鍵 值 說 明
IGNBRK 忽略BREAK鍵輸入
BRKINT 如果設定了IGNBRK,BREAK鍵輸入將被忽略
IGNPAR 忽略奇偶校驗錯誤
PARMRK 標識奇偶校驗錯誤
INPCK 允許輸入奇偶校驗
ISTRIP 去除字元的第8個位元
INLCR 將輸入的NL(換行)轉換成CR(回車)
IGNCR 忽略輸入的回車
ICRNL 將輸入的回車轉化成換行(如果IGNCR未設定的情況下)
IUCLC 將輸入的大寫字元轉換成小寫字元(非POSIX)
IXON 允許輸出時對XON/XOFF流進行控制
IXANY 輸入任何字元將重啟停止的輸出
IXOFF 允許輸入時對XON/XOFF流進行控制
IMAXBEL 當輸入佇列滿的時候開始響鈴
c_oflag:輸出模式標誌,控制終端輸出方式,具體引數如表2所示。 表2 c_oflag引數
鍵 值 說 明
OPOST 處理後輸出
OLCUC 將輸入的小寫字元轉換成大寫字元(非POSIX)
ONLCR 將輸入的NL(換行)轉換成CR(回車)及NL(換行)
OCRNL 將輸入的CR(回車)轉換成NL(換行)
ONOCR 第一行不輸出回車符
ONLRET 不輸出回車符
OFILL 傳送填充字元以延遲終端輸出
OFDEL 以ASCII碼的DEL作為填充字元,如果未設定該引數,填充字元為NUL
NLDLY 換行輸出延時,可以取NL0(不延遲)或NL1(延遲0.1s)
CRDLY 回車延遲,取值範圍為:CR0、CR1、CR2和 CR3
TABDLY 水平製表符輸出延遲,取值範圍為:TAB0、TAB1、TAB2和TAB3
BSDLY 空格輸出延遲,可以取BS0或BS1
VTDLY 垂直製表符輸出延遲,可以取VT0或VT1
FFDLY 換頁延遲,可以取FF0或FF1
c_cflag:控制模式標誌,指定終端硬體控制資訊,具體引數如表3所示。 表3 c_cflag引數
鍵 值 說 明
CBAUD 波特率(4+1位)(非POSIX)
CBAUDEX 附加波特率(1位)(非POSIX)
CSIZE 字元長度,取值範圍為CS5、CS6、CS7或CS8
CSTOPB 設定兩個停止位
CREAD 使用接收器
PARENB 使用奇偶校驗
PARODD 對輸入使用奇偶校驗,對輸出使用偶校驗
HUPCL 關閉裝置時掛起
CLOCAL 忽略調變解調器線路狀態
CRTSCTS 使用RTS/CTS流控制
c_lflag:本地模式標誌,控制終端編輯功能,具體引數如表4所示。 表4 c_lflag引數
鍵 值 說 明
ISIG 當輸入INTR、QUIT、SUSP或DSUSP時,產生相應的訊號
ICANON 使用標準輸入模式
XCASE 在ICANON和XCASE同時設定的情況下,終端只使用大寫。
ECHO 顯示輸入字元
ECHOE 如果ICANON同時設定,ERASE將刪除輸入的字元
ECHOK 如果ICANON同時設定,KILL將刪除當前行
ECHONL 如果ICANON同時設定,即使ECHO沒有設定依然顯示換行符
ECHOPRT 如果ECHO和ICANON同時設定,將刪除打印出的字元(非POSIX)
TOSTOP 向後臺輸出傳送SIGTTOU訊號
c_cc[NCCS]:控制字元,用於儲存終端驅動程式中的特殊字元,如輸入結束符等。c_cc中定義瞭如表5所示的控制字元。 表5 c_cc支援的控制字元
巨集 說 明 巨集 說 明
VINTR Interrupt字元 VEOL 附加的End-of-file字元
VQUIT Quit字元 VTIME 非規範模式讀取時的超時時間
VERASE Erase字元 VSTOP Stop字元
VKILL Kill字元 VSTART Start字元
VEOF End-of-file字元 VSUSP Suspend字元
VMIN 非規範模式讀取時的最小字元數
tcsetattr函式用於設定終端的相關引數。引數fd為開啟的終端檔案描述符,引數optional_actions用於控制修改起作用的時間,而結構體termios_p中儲存了要修改的引數。 optional_actions可以取如下的值: TCSANOW:不等資料傳輸完畢就立即改變屬性。 TCSADRAIN:等待所有資料傳輸結束才改變屬性。 TCSAFLUSH:清空輸入輸出緩衝區才改變屬性。 錯誤資訊: EBADF:非法的檔案描述符。 EINTR:tcsetattr函式呼叫被訊號中斷。 EINVAL:引數optional_actions使用了非法值,或引數termios中使用了非法值。 ENCTTY:非終端的檔案描述符。

相關推薦

linux串列收發資料不對由於設定不對導致

最近一個專案使用了嵌入式linxu串列埠通訊,由於通訊使用的是2進位制資料,經常出現通訊校驗失敗,資料幀大小沒問題,就是校驗出錯 c_iflag引數表 鍵 值 說 明 IGNBRK 忽略BREAK鍵輸入 BRKINT 如果設定了IGNBRK,BREAK鍵輸入

python 實現linux串列收發資料

使用python實現在linux平臺收發串列埠資料,原始碼如下: uart.py #!/usr/bin/python import serial,time,thread ser=serial.Serial('/dev/ttyS1', timeout=1) print s

ZigBeeCC253005 串列收發資料

串列埠收發資料 目錄 一、預備知識:        UART模式提供非同步序列介面。在UART模式中,介面使用雙線連線方式(含有引腳RXD、 TXD)或者四線連線方式(含有引腳RXD、 TXD、RTS和CTS),其中RTS和CTS引腳用於硬體流量

基於51 微控制器的串列收發資料

在進行串列埠的收發資料過程中一定要注意波特率的問題。 大多數51微控制器用的都是11m晶振而只有少部分用的是奇葩的12m(樓主的就是),在12m晶振進行串列埠通訊時切忌要將波特率設定為4800以下,應為12m晶振的波特率在9600以上誤差很大容易丟失資料,動手能力強的可以折騰一下用定時器輸出96

STM32-----採用DMA的方式實現串列收發資料

STM32-----採用DMA的方式實現串列埠收發資料 概述 想必看到這篇部落格的你已經知道了DMA的好處了吧,所以這兒就不過多地講述DMA對於緩解MCU壓力有多麼重要的用途,DMA在很多方面都可以使用,如IIC,SPI,USART等,這兒主要給出DMA

串列收發資料實驗

一、實驗目的      利用CC2530的串列埠0不停的列印資訊到電腦上,同時接收從串列埠發過來了的資料,把傳送過來的資料直接送回給電腦。 二、實驗環境      1.硬體:通用節點或任意感測器節點一個、USB模擬器、USB電纜、PC機;      2.軟體:IAR E

MTK之UART串列收發資料

暫存器 UARTn_RBR: Rx Buffer Register,通過讀取該暫存器接收資料。要求LCR[7]=0。 UARTn_THR: Tx Holding Register,資料先寫入該暫存器,再送至PC端。要求LCR[7]=0。 UARTn_IER

【Python】簡單的串列收發資料

實現效果: Python端執行的時候開啟COM3,然後準備從鍵盤獲取資料,併發送,同時接收串列埠除錯助手COM1傳送過來的資料 Python端: 串列埠除錯助手: 串列埠除錯助手使用COM1,能顯示Python端發過來的資料,當點擊發送的時候,Python端

c語言串列收發資料VS2013

最近師兄師姐在做GPS定姿的專案,需要把天線解算的結果從電腦串列埠傳送出去,對於VS和C語言小白的我承擔了把資料從串列埠傳送出去的任務。網上串列埠通訊的例子倒是不少,在傳送資料方面,下的功夫倒也不是很多,主要是老師還讓我把資料接收下來校驗傳送的對不對,於是開始了除錯程式碼的

Linux串列程式設計,實現不定長收發資料

一、需求: 需要利用串列埠對兩臺裝置進行資料互動。 要求:資料包大小不定。能夠實現阻塞讀取每一個數據包。粘包,丟包問題在解析資料包中處理。 二、設計 為了實現不定長接收資料包,利用了 struct termios的兩個成員屬性:  newtio.c_cc

Linux串列程式設計教程——串列程式設計詳原始碼解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列程式設計(二----圖文並茂,講解深刻http://blog.csdn.net/w28252

Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.ne

【C語言實現串列通訊知識點整理串列開啟、設定資料成功後進行資料讀寫

int OpenDev(char *Dev) { int fd = open(Dev,O_RDWR | O_NOCTTY | O_NONBLOCK); if(-1 == fd) { perror("Can't Open Serial Port"); return -1;

linux c poll 串列資料例程

epoll機制讀取linux串列埠資料 https://blog.csdn.net/coding__madman/article/details/51657944 com.c #include "com.h" int openSerial(char *cSerialName

[轉]串列收發float型資料

如果是格式化 ,用sprintf / printf; 如果傳送原始記憶體資料流, 可按下面傳送, 傳送  float a = 1.23; double b=3.2; SendByt

linux串列程式設計控制與終端

流控制 資料在兩個串列埠之間傳輸時,常常會出現丟失資料的現象,或者兩臺計算機的處理速度不同,如桌上型電腦與微控制器之間的通訊,接收端資料緩衝區已滿,則此時繼續傳送來的資料就會丟失。流控制能解決這個問題,當接收端資料處理不過來時,就發出“不再接收”的訊號,傳送端就停止傳送,直到收到“可以繼續傳送”

linux串列程式設計termios結構體說明

termios結構體說明 轉https://www.cnblogs.com/li-hao/archive/2012/02/19/2358158.html termios結構體中,該結構體一般包括如下的成員:tcflag_t       c_iflag;

Linux串列serial、uart驅動程式設計

一、核心資料結構串列埠驅動有3個核心資料結構,它們都定義在<#include linux/serial_core.h>1、uart_driveruart_driver包含了串列埠裝置名、串列埠驅動名、主次裝置號、串列埠控制檯(可選)等資訊,還封裝了tty_dri

STM32的串列傳送資料字元,字串,數字.......重點

#include "stm32f10x.h" #include <stdio.h>    //下面strlen函式需要此標頭檔案 #include "USART.h" /**********************************************

樹莓3Ubuntu虛擬機器編譯程式 串列收發測試

*,總結: 1,配置樹莓串列埠 5.2,找到串列埠裝置,和波特率 5.3,交叉編譯程式測試(https://github.com/zacSuo/SerialPort) 嘗試流程: 1,配置樹莓串列埠 2,Windows下收發程式 2.1,使用IBM官網的串

每日一篇--linux重定向串列列印到telnet方便遠端調式

在嵌入式開發中,我們都是使用串列埠進行除錯定位問題。然而在成品除錯或者遠端除錯時,沒有串列埠,只能telnet進去,少了很多應用程序的列印,這樣就不利於我們發現問題。需要一種方法把串列埠所有輸出重定向到telnet。 /***********************