tcp/ip ポートとシリアル ポートの両方から情報を受け取るプログラムを作成しています。また、シリアルポートへの書き込みも想定されています。2 つのプログラム (シリアル用と tcp/ip 用) がありますが、それらを 1 つのプログラム全体に配置しようとしています。私が得ている結果は、tcp/ip データが読み取られるときにシリアル データのみを読み取るということです。これは、そんな問題ではありません。大きな問題は、書き込み機能がまったく機能していないように見えることです。誰かが理由を知っていますか?
シリアル関数を実行するメソッドのコードを次に示します。メイン メソッドは tcp/ip ソケットを作成し、このメソッドを呼び出します。
int work()
{
//set up the serial port
int result = 0;
int portID = -1;
char *device = "/dev/ttyUSB1";
int rate = convertRate("115200");
char parity = convertParity("N");
int databits = convertDatabits("8");
int stopbits = convertStopbits("1");
portID = posixComOpen(device,rate,parity,databits,stopbits);
maxslot = listener;
do
{
fd_set set;
int i;
FD_ZERO(&set);
FD_SET(1, &set);
FD_SET(listener, &set);
for(i=0; i < SLOTCOUNT; i++)
{
if(slots[i])
{
FD_SET(slots[i], &set);
}
}
int koliko = select(maxslot+1, &set, NULL, NULL, NULL);
if(koliko==-1)
err(5, "select()");
if(FD_ISSET(1, &set))
{
int size;
if(ioctl(1, FIONREAD, &size) != -1){
char *buf;
// printf("Reading %d bytes...\n", size);
buf = malloc(size+1);
read(1, buf, size);
buf[size] = 0;
// printf("Received %s\n", buf);
broadcast_message(0, buf);
free(buf);
}
else
err(7, "ioctl() stdio");
}
if(FD_ISSET(listener, &set))
{
int accepted = accept(listener, NULL, NULL);
if(accepted == -1)
err(6, "accept()");
slots[accepted] = accepted;
if(accepted > maxslot)
maxslot = accepted;
}
for(i = 0; i < SLOTCOUNT; i++)
{
if(slots[i] && FD_ISSET(slots[i], &set))
{
// printf("Received on %d\n", i);
int size;
if(ioctl(i, FIONREAD, &size) != -1){
if(size > 0)
{
char *buf;
// printf("Reading %d bytes...\n", size);
buf = malloc(size+1);
read(i, buf, size);
buf[size] = 0;
// printf("Received %s\n", buf);
broadcast_message(i, buf);
free(buf);
}
else
{
shutdown(i, SHUT_RDWR);
close(i);
slots[i] = 0;
// printf("Disconnect on %d\n", i);
}
}
else
err(8, "ioctl() net");
}
}
//recieve and send data to serial
char input =0;
while(posixComDataReady(portID) && posixComRead(portID, &input)) {
printf("%c", input);
//fflush(stdout);
} //while
/* Write character to Vex */
if(posixComWrite(portID, 'x') < 0)
printf("Error Writing char %c",'x');
//end serial code
} while(1);
return 0;
}
EDiT: poxixComWrite() メソッドは次のとおりです。
char posixComWrite(int port, char src) {
return (write(port, &src, 1) == 1);
} //posixComWrite
繰り返しますが、このプログラムは PosixComWrite() メソッドを除いて機能しています。エラーにはなりません。「1」を返します。文字を受信しないマイクロコントローラーに書き込んでいます。これは、tcp/ip のコンテキストから取り出されたときに機能していました。ここで奇妙な出来事が起こっていますか?