行いたいこと
Linux(Debian)から外部デバイスに対してシリアル通信を行いたくプログラムを記載しています。
言語はCで、Linux側のシリアルは/dev/ttyS0として認識しています。
症状
外部デバイスに対して"TC\r\n"を送信すると、時刻情報が戻ってくるはずなのですが、どうもシリアル送信できていないようなのです。
なお外部デバイスからデータを手動で送ってもらうと、なぜか受信はできており、送信だけができない状態のようなのです。なお受信確認は別なプログラムで、無限ループの中、readを行っているだけのものです。
確認済み事項
- /dev/ttyS0アクセスに対する権限付与
- ユーザのdialoutグループへの追加
- minicomからの送受信(成功)
ソース(異常処理等割愛)
C
1#include <sys/types.h> 2#include <sys/stat.h> 3#include <sys/ioctl.h> 4#include <fcntl.h> 5#include <termios.h> 6#include <unistd.h> 7#include <string.h> 8#include <stdio.h> 9 10#define SERIAL_PORT "/dev/ttyS0" // シリアルインターフェースに対応するデバイスファイル 11#define BAUD_RATE B9600 // RS232C通信ボーレート 12 13int main(int argc, char *argv[]) 14{ 15 char rBuf[255] = {'\0'}, sBuf[255] = {'\0'}; // バッファ 16 int fd, i, len; 17 struct termios tio; // シリアル通信設定 18 19 fd = open(SERIAL_PORT, O_RDWR); // デバイスをオープンする 20 tio.c_cflag += CREAD; // 受信有効 21 tio.c_cflag += CLOCAL; // ローカルライン(モデム制御なし) 22 tio.c_cflag += CS8; // データビット:8bit 23 tio.c_cflag += 0; // ストップビット:1bit 24 tio.c_cflag += 0; // パリティ:None 25 tio.c_cc[VMIN] = 0; 26 tio.c_cc[VTIME] = 30; 27 // ボーレートの設定 28 cfsetispeed(&tio,BAUD_RATE); 29 cfsetospeed(&tio,BAUD_RATE); 30 ioctl(fd, TCSETS, &tio); // ポートの設定を有効にする 31 strcpy(sBuf,"TC\r\n"); 32 write(fd, sBuf, 4); // デバイスへ書き込み 33 printf("%s\n", sBuf); 34 len = read(fd, rBuf, sizeof(rBuf)); // デバイスから255バイト読み込み 35 if (0 < len) { 36 for(i = 0; i < len; i++) { 37 printf("%s", rBuf[i]); 38 } 39 printf("\n"); 40 } 41 close(fd); // デバイスのクローズ 42 return 0; 43} 44
ご教授、賜れましたら幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/07 04:10
2018/06/07 04:28 編集
2018/06/07 04:33
2018/06/07 04:50 編集
2018/06/07 04:56
2018/06/07 05:00
2018/06/07 05:02
2018/06/07 05:05
2018/06/07 23:41