シリアル ポート経由でデバイスと通信できるように、C でプログラムを作成する必要があります。ポートの構成は、9600BPS スタート ビット:1 データ ビット:8 パリティ ビット:偶数ストップ ビット:1 である必要があります。ポートの構成方法のコピーをお送りしますが、問題があり、解決できます。
100 ~ 200 ミリ秒ごとにステータス リクエストをデバイスに送信すると、タイマーがあるため、デバイスは応答するはずです。電源投入シーケンスでデバイスにコマンドを送信すると、デバイスは応答しますが、いくつかの送受信コマンドの後、送信が停止するため、受信も停止し、書き込みコマンドと読み取りコマンドが送信されることに気付きます-1、その後は何も起きていません。なぜこれが起こっているのですか?
読み取ろうとしていて、読み取るものが何もないため、この場合は-1になりますが、この場合、書き込み後に-1になるのはなぜですか? よろしくお願いします。
int main(int argc, char *argv[]) {
timer_t tid = 0;
struct itimerspec it;
fd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("open_port: Unable to open /dev/ttyS0\n");
exit(1);
}
satimer.sa_handler = signal_handler_TIMER;
satimer.sa_flags = 0;
satimer.sa_restorer = NULL;
sigaction(SIGALRM, &satimer, NULL);
it.it_value.tv_sec = 0;
it.it_value.tv_nsec = 10000000;
it.it_interval.tv_sec = 0;
it.it_interval.tv_nsec = 10000000;
if (timer_create(CLOCK_REALTIME, NULL, &tid) == -1)
fprintf(stderr, "error in timer_create \n");
// printf("timer ID is 0x%lx\n", (long) tid);
if (timer_settime(tid, 0, &it, NULL) == -1)
fprintf(stderr, "error in settime \n");
fcntl(fd, F_SETFL, FNDELAY);
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETFL, O_SYNC);
tcgetattr(fd, &termAttr);
//baudRate = B115200; /* Not needed */
cfsetispeed(&termAttr, B9600);
cfsetospeed(&termAttr, B9600);
termAttr.c_cflag |= PARENB;
termAttr.c_cflag &= ~PARODD;
termAttr.c_cflag &= ~CSTOPB;
termAttr.c_cflag &= ~CSIZE;
termAttr.c_cflag |= CS8;
termAttr.c_cflag |= (CLOCAL | CREAD);
termAttr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
termAttr.c_iflag &= ~(IXON | IXOFF | IXANY);
termAttr.c_oflag &= ~OPOST;
termAttr.c_cc[VMIN] = 5;
termAttr.c_cc[VTIME] = 5;
tcsetattr(fd, TCSANOW, &termAttr);
CleanRxBuffer();
PowerUp();
......
void PowerUp(void){
unsigned char *p_commands,ima,komanda = STATUS_REQUEST;
p_commands = &comandi[0];
unsigned char *p_tx_buffer_;
for (;;) {
if ((milisekundi == 10) || (milisekundi == 30) || (milisekundi == 50)
|| (milisekundi == 70) || (milisekundi == 90)) {
makeTXpaket(0x00);
makeTXpaket(komanda);
p_tx_buffer_ = &tx_buffer[1];
nbytes = write(fd, tx_buffer, *p_tx_buffer_);
if (nbytes != sizeof(tx_buffer)) {
/* problem! */
printf("error writing on serial port!!!");
}
sleep(0.2);
bytes = read(fd, rx_buffer, sizeof(rx_buffer));
if (bytes != sizeof(rx_buffer)) {
/* problem! */
printf("error reading on serial port!!!\n");
}
printf("%X\n", rx_buffer);
}
ima = CheckRXbuffer();
if ((answer == 0x40) && (ima != 0x00)) {
p_commands++;
komanda = *p_commands;
}
if ((answer == 0x50) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0x1B) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0xC0) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0xC4) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0xC1) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0xC2) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0xC5) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0xC6) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0xC7) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0xC3) && (ima != 0x00)){
p_commands++;
komanda = *p_commands;
}
if ((answer == 0x11) && (ima != 0x00)){
break;
}
if ((*p_commands) == 0xFF) {
break;
}
CleanRxBuffer();
}
}