LINUX串列埠一次不能全部讀取串列埠內容

2021-08-25 11:47:11 字數 843 閱讀 6120

菜鳥級別的問題,希望對像我一樣的人有所幫助。

我在做乙個串列埠通訊,上位機通過串列埠向控制板傳送訊號,訊號的長度為23個位元組。我使用linux程式設計,自帶的read()函式,用乙個50個自己的陣列來讀,但是讀取的位元組數為8,9,13等不確定長度。不知道怎麼做,想起來以前有個師兄跟我提過,微控制器讀取串列埠時,是乙個位元組乙個位元組讀的,然後把讀到幀頭的資料,然後按照一定順序往後讀取定長的位元組就好。

我問了個員工,他跟我解釋說,串列埠通訊是要時間的,比如你先讀了一次,但是那邊還沒發完的概率是非常大的,所以,需要開闢乙個快取區,來儲存你收到的內容,你要把收到第一次之後,然後再接著讀取你需要的資料長度,這樣就好了。

於是我就修改了我的**,我每次讀取的長度為8個位元組,實際測試之後,可能會讀到6個到8個位元組,但多讀幾次就能都讀全了。我的串列埠開啟之後,一直在迴圈讀取串列埠內容。**如下,希望對需要的人有幫助。

char cmd_buf[23];

char rv_buf[8];

int ret_len,temp,i;

int len_sum = 0;

while(1)

if(ret_len >0 && len_sum<23)//如果讀取資料大於0,而且總長度小於23,資料拷貝,繼續讀

len_sum = 0;

} //判斷幀頭,不正確繼續迴圈

if(cmd_buf[0] != 0xeb || cmd_buf[1] != 0x90)

//幀頭正確,進行你的資料幀解析和相應的操作

/*....

*/memset(cmd_buf,0,sizeof(cmd_buf));//一幀解析完之後,將cmd_buf清零

}

C語言一次性讀取檔案全部內容

關鍵是獲取檔案大小,知道檔案大小就可以用fread一次讀入記憶體中。使用fseek 定位到檔案末尾,ftell 計算當前檔案位置指標相對於檔案首的偏移位元組數,也就是檔案的大小,最後用rewind 重新定位到檔案開頭位置,ok!fread 搞定。我下面這個函式寫的不怎麼好,大家理解思想就行了。讀取檔...

hadoop hadoop的一次讀取

一次hadoop的read getfilesystem public static filesystem getfilesystem throws exception configuration configuration基本就是乙個空物件。新增了2個配置檔案到資源列表。adddefaultreso...

記一次mysql服務不能啟動

之前開啟後台專案的機器,發現登陸後台系統時,輸入使用者名稱 密碼後,提示使用者名稱或密碼錯誤。1.連線mysql資料庫,發現鏈結不上,但是ps ef grep mysql 發現有mysql服務 2.輸入mysql u root p 提示說找不到sock檔案 3.service mysqld rest...