write () возвращает ошибку: неверный аргумент при использовании последовательного порта - PullRequest
0 голосов
/ 04 октября 2011

Я пытаюсь отправить данные через последовательный порт, но команда записи всегда возвращает -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

Я получаю неверный аргумент в качестве ошибки, но, посмотрев в Google, я не могу найти ничего, объясняющего, что это значит или как это исправить. самая закрытая вещь, которую я нашел, была this , но она использует st0, а не ttyS0, поэтому я не уверен, что это даже то же самое

Может кто-нибудь объяснить, что я делаю неправильно, чтобы получить эту ошибку и как ее исправить?

Ответы [ 3 ]

1 голос
/ 04 октября 2011

Вы получаете EINVAL от write ().Это означает, что один из ваших аргументов функции недействителен: EINVAL = * E * rror, * INVAL * id аргумент.У функции есть три аргумента:

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

write () задрал, когда увидел один из этих трех.Так что один из этих трех неправильный.

Так что поместите printf () перед вызовом write () и посмотрите, какой (или два, или три) неправильный.

Где находитсяфактический код (не ваша память о коде), который делает open ()?Является ли дескриптор файла, возвращаемый open () тем же (Comid), в который вы пытаетесь записать ()?Если нет, то это ваша проблема.

Вероятная ошибка в этом мэшапе.

1 голос
/ 04 октября 2011

Вы должны проверять errno (это включает в себя вызов perror()), если вызов write не удался, о чем свидетельствует возврат -1. Если запись успешна, она оставляет errno без изменений.

Чтобы проверить это, вам действительно следует присвоить возвращаемое значение переменной со знаком, предпочтительно ssize_t, а не unsigned long.

0 голосов
/ 09 февраля 2013

EINVAL от записи (3) означает:
STREAM или мультиплексор, на который ссылается fildes, связан (прямо или косвенно) ниже по потоку от мультиплексора.

В сущности, это означает, что ваш последовательный порт открыт для записи одновременно - по крайней мере, с перерывами. USB к последовательным конвертерам, кажется, особенно уязвимы для этого. Другие последовательные драйверы, как правило, позволяют открывать их только один раз.

Источник:
http://linux.die.net/man/3/write

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...