Цитата(Tiny @ Aug 22 2010, 15:31)

Так для передачи 00101 от 1-го пользователя эта процедура должна произойти 5 раз. А не получится ли так, что после передачи двух младших разрядов сюда вклинется другой пользователь передающий команду, допустим 05603?
Вы же пишете программу для сервера, получаете команды от пользователей.
Обеспечте атомарность выполнения каждой команды. - не слать другую команду устройствам до тех пор пока не получен ответ на текущую.
Цитата(Tiny @ Aug 22 2010, 18:25)

Посылка одного разряда кода занимает один байт. Но всего в коде таких разрядов 5 (00101). В коде информация об адресе назначения, но не отправителя. В момент между разрядами от одного клиента может попасть разряд от другого.
Я вношу полученные данные в переменные. Собираются все разряды, анализируется этому ли устройству адресовалось и только то устройство, которому адресовалось выполняет команду и отправляет код обратно.
Есть 100 TCP сокетов - клиенты, и есть 100 исполнительных устройств.
Заводите как минимум два треда. Один обслуживает сокеты, второй - uart.
Создаете некую Cmd структуру, которая может быть например такой:
Код
typedef struct tagCMD
{
PTCP_SOCKET socket;
U8 cmd[ MAX_CMD_LEN ];
int cmd_len;
U8 resp[ MAX_RESP_LEN ];
int resp_len;
} CMD, *PCMD;
далее принимаете любую "хню" из некоего сокета-клиента, выделяете структурку и заполняете ее как-то так:
Код
OnSocketReadEvent( PTCP_SOCKET socket ...)
{
pCmd = (PCMD)Heap_Alloc( sizeof( CMD) );
pCmd->socket = socket; // <--- это клиент, который послал команду
pCmd->cmd_len = socket->bytes_to_read;
socket->read( pCmd->cmd, pCmd->cmd_len);
...
ставите ее в очередь на исполнение для другого треда:
Код
enqueue( GlobalCmdQueue, pCmd);
}
в другом треде, делаете буквально так:
Код
while(TRUE)
{
// спим пока нет события записи в очередь
GlobalCmdQueueEvent->WaitFor( infinite );
while ( (pCmd = dequeue( GlobalCmdQueue)) != NULL )
{
// отправка на исполнительный девайс
Com->write( pCmd->cmd, pCmd->len);
...
// чтение ответа от девайса
Com->read( pCmd->resp, &pCmd->resp_len);
// отправка результата клиенту
pCmd->socket->write( pCmd->resp, pCmd->resp_len);
// освобождение памяти
Heap_Free( pCmd );
}
}
Вот собсно и все...