write()返回错误:使用串行端口时参数无效

时间:2011-10-04 12:56:17

标签: linux serial-port

我正在尝试使用串行端口发送数据,但写入命令始终返回-1。

这是写命令的代码。

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

我得到了无效的参数作为错误,但在查看谷歌后我找不到任何解释这意味着什么或如何解决它。我发现关闭的东西是this,但它使用的是st0而不是ttyS0所以我不确定它是否是同样的东西。

任何人都可以解释我做错了什么来得到这个错误以及如何解决它?

3 个答案:

答案 0 :(得分:1)

如果errno调用失败,您应该只检查perror()(这包括调用write),它通过返回-1来指示。如果写入成功,则会使errno保持不变。

为了对此进行测试,您应该将返回值分配给具有签名类型的变量 - 最好是ssize_t - 而不是unsigned long

答案 1 :(得分:1)

你从write()获得了EINVAL。这意味着你对函数的一个参数是无效的:EINVAL = * E * rror,* INVAL * id参数。该函数有三个参数:

     arg               your variable
---------------------- -------------
int file descriptor:     Comid
void *buf:               buf   
size_t size:             nobtw
当看到这三个中的一个时,写道()puked。所以这三个中的一个是错误的。

所以在调用write()之前放一个printf(),然后查看哪一个(或两个;或三个)是错误的。

执行open()的实际代码(不是代码的内存)在哪里? open()返回的文件描述符是否与您尝试写入()的同一个(Comid)?如果没有,那就是你的问题。

这是mashup中可能出现的错误。

答案 2 :(得分:0)

EINVAL from write(3)表示:
fildes引用的STREAM或多路复用器在多路复用器的下游(直接或间接)链接。

这基本上意味着还有其他东西让您的串口同时打开 - 至少是间歇性的。 USB转串口转换器似乎特别容易受此影响。其他串行驱动程序通常只允许您打开一次。

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