簡體   English   中英

write()返回錯誤:使用串行端口時參數無效

[英]write() returns error:invalid argument when using serial port

我正在嘗試使用串行端口發送數據,但寫入命令始終返回-1。

這是write命令的代碼。

int WriteComm( int Comid, void *buf, int nobtw )
{
unsigned long nobw;
nobw = write(Comid, buf, nobtw);

move(10,5);
perror("");
sleep(10);

return nobw;
}

這是調用它的代碼

gnobw = WriteComm(theApp.idComDev[Seg],&head[1],1); //send network address

我得到了無效的爭論作為錯誤,但在谷歌上看后,我找不到任何解釋這意味着什么或如何解決它。 我發現關閉的東西是這個,但它使用st0而不是ttyS0所以我不確定它是否甚至相同的東西。

任何人都可以解釋我做錯了什么來得到這個錯誤以及如何解決它?

你應該只檢查errno (這包括調用perror() )如果write調用失敗,它通過返回-1表示。 如果寫入成功,則會使errno保持不變。

為了對此進行測試,您應該將返回值分配給具有簽名類型的變量 - 最好是ssize_t - 而不是unsigned long

你從write()獲得了EINVAL。 這意味着你對函數的一個參數是無效的:EINVAL = * E * rror ,* INVAL * id參數。 該函數有三個參數:

     arg               your variable
---------------------- -------------
int file descriptor:     Comid
void *buf:               buf   
size_t size:             nobtw

當看到這三個中的一個時,寫道()。 所以這三個中的一個是錯的。

所以在調用write()之前放一個printf()並查看哪一個(或兩個;或三個)是錯誤的。

執行open()的實際代碼(不是代碼的內存)在哪里? open()返回的文件描述符是否與您嘗試寫入()的同一個(Comid)? 如果沒有,那就是你的問題。

這是mashup中可能出現的錯誤。

來自寫(3)的EINVAL意味着:
由fildes引用的STREAM或多路復用器在多路復用器的下游(直接或間接)鏈接。

這基本上意味着還有其他東西讓你的串口同時打開 - 至少是間歇性的。 USB轉串口轉換器似乎特別容易受此影響。 其他串行驅動程序通常只允許您打開一次。

資源:
http://linux.die.net/man/3/write

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM