Linuxシリアルプログラミング(2)


この構造体におけるc_cflagは最も重要で、ボートレート、データビット、チェックビット、停止ビットを設定することができます.ボーレートを設定するには、数値の前に'B'を付ける必要があります.
c_lflagメンバー
ISIGは、文字INTR、QUIT、SUSP、またはDSUSPを受信すると、対応する信号を生成する.
XCASE(POSIXに属さない;LINUXではサポートされない)ICANONが同時に設定されている場合、端末は大文字のみとなる.入力は、/接頭辞の文字を除いて小文字に変換されます.出力時には、大文字は接頭辞/、小文字は大文字に変換されます.
ECHOエコー入力文字.
ECHOEはICANONが同時に設定されている場合、文字ERASEは前の入力文字を消去し、WERASEは前の単語を消去します.
ECHOK ICANONが同時に設定されている場合、文字KILLは現在の行を削除します.
ECHONLはICANONが同時に設定されている場合は、ECHOが設定されていなくても文字NLを表示します.
ECHOCTL(POSIXに属さない)ECHOが併設されている場合、TAB、NL、START、STOPを除くASCII制御信号は^xとしてエコーされ、ここでXは制御信号より0 x 40大きいASCIIコードである.例えば、文字0 x 08(BS)は^Hとしてエコーされる.
ECHOPRT(POSIXではない)ICANONとIECHOが同時に設定されている場合、文字は削除と同時に印刷されます.
ECHOKE(POSIXではない)ICANONが同時に設定されている場合は、ECHOEとECHORPTが指定されているように、KILLを再表示すると1行の各文字が削除されます.
DEFECHO(POSIXに属していない)は、1つのプロセスでのみ表示されます.
FLUSHO(POSIXに属していない;LINUXはサポートしていない)出力がリフレッシュされる.このフラグは、文字DISCARDを入力することでオン/オフできます.
NOFLSHは、SIGINT、SIGQUIT、SIGSUSP信号の生成時に入力および出力キューをリフレッシュすることを禁止する.
TOSTOPは、制御端末を書こうとするバックグラウンドプロセスグループにSIGTTOU信号を送信する.
PENDIN(POSIXに属していない;LINUXはサポートしていない)は、1文字を読み込むと、入力キューのすべての文字が再出力されます.(bashはtypeaheadを彼で処理します).
IEXTENは、カスタム入力処理の実装を有効にします.このフラグはICANONと同時に使用する必要があり、特殊文字EOL 2、LNEXT、REPRINT、WERASE、IUCLCフラグが有効であることを説明することができます.
c_iflagメンバー
Flag Description
GNBRK入力中のBREAK状態を無視
BRKINT IGNBRKが設定されている場合、BREAKは無視されます.設定されていないがBRKINTが設定されている場合、BREAKは入力および出力キューをリフレッシュし、端末がフロントプロセスグループの制御端末である場合、このプロセスグループ内のすべてのプロセスはSIGINT信号を受信する.IGNBRKもBRKINTも設定されていない場合、BREAKはPAMRKが設定されていない限りNUL同義文字とみなされます.この場合、シーケンス/377/0/0とみなされます.
IGNPARはフレームエラーとパリティエラーを無視
PAMRK IGNPARが設定されていない場合は、パリティエラーまたはフレームエラーのある文字の前に/377/0を挿入します.IGNPARもPAMRKも設定されていない場合は、すべてのパリティエラーまたはフレームエラーの文字を/0とします.
INPCK入力パリティ検出を有効にします.
ISTRIPは8位を外した.
INLCRは入力したNLをCRに翻訳します.
IGNCRは入力中のリターンを無視します.
ICRNLは、IGNCRが設定されていない限り、入力されたリターンを新しい行文字に翻訳します.
IUCLC(POSIXではない)は、入力中の大文字を小文字にマッピングします.
IXON出力可能なXON/XOFFフロー制御
IXANY(POSIX.1;XSIに属さない)は、出力を再開する任意の文字を許可します.
IXOFF入力可能なXON/XOFFフロー制御
IMAXBEL(POSIXではない)入力キューがいっぱいになるとベルが鳴ります.LINUXはビットを実装せず、常に設定されているとみなされます.
 
c_oflagメンバー
OPOSTは,具体的に自己定義の出力を実現することを可能にする.
OLCUC(POSIXに属さない)は、出力中の小文字を大文字にマッピングします.
ONLCR(XSI)出力の新しい行を折り返し-改行にマッピング
OCRNLは、出力中のリターンを新しい行文字にマッピングします.
ONOCRは0列目ではリターンを出力しません.
ONLRETはリターンを出力しません.
OFILLは、遅延としてパディング文字を送信します.
OFDEL(POSIXに属さない)パディング文字はASCII DEL(0177)である.パディング文字を設定しない場合はASCII NULです.
NLDLYの新しい行遅延マスク.NL 0とNL 1の値をとります.
CRDLYリターン遅延マスク.値は、CR 0、CR 1、CR 2、またはCR 3です.
TABDRY水平ジャンプ遅延マスク.値はTAB 0,TAB 1,TAB 2,TAB 3(またはXTABS)とする.値をTAB 3、すなわちXTABSとし、拡張ホップをスペース(各ホップ文字に8つのスペースを埋め込む)とする.
BSDLYリターン遅延マスク.BS 0またはBS 1の値をとる.(実現されたことがない)
VTDLY垂直ホッピングマスク.値はVT 0またはVT 1とする.
FFDLYテーブル遅延マスク.FF 0またはFF 1の値をとります.
c_lflagメンバー
Flag Description
ISIGは、文字INTR、QUIT、SUSP、またはDSUSPを受信すると、対応する信号を生成する.
XCASE(POSIXに属さない;LINUXではサポートされない)ICANONが同時に設定されている場合、端末は大文字のみとなる.入力は、/接頭辞の文字を除いて小文字に変換されます.出力時には、大文字は接頭辞/、小文字は大文字に変換されます.
ECHOエコー入力文字.
ECHOEはICANONが同時に設定されている場合、文字ERASEは前の入力文字を消去し、WERASEは前の単語を消去します.
ECHOK ICANONが同時に設定されている場合、文字KILLは現在の行を削除します.
ECHONLはICANONが同時に設定されている場合は、ECHOが設定されていなくても文字NLを表示します.
ECHOCTL(POSIXに属さない)ECHOが併設されている場合、TAB、NL、START、STOPを除くASCII制御信号は^xとしてエコーされ、ここでXは制御信号より0 x 40大きいASCIIコードである.例えば、文字0 x 08(BS)は^Hとしてエコーされる.
ECHOPRT(POSIXではない)ICANONとIECHOが同時に設定されている場合、文字は削除と同時に印刷されます.
ECHOKE(POSIXではない)ICANONが同時に設定されている場合は、ECHOEとECHORPTが指定されているように、KILLを再表示すると1行の各文字が削除されます.
DEFECHO(POSIXに属していない)は、1つのプロセスでのみ表示されます.
FLUSHO(POSIXに属していない;LINUXはサポートしていない)出力がリフレッシュされる.このフラグは、文字DISCARDを入力することでオン/オフできます.
NOFLSHは、SIGINT、SIGQUIT、SIGSUSP信号の生成時に入力および出力キューをリフレッシュすることを禁止する.
TOSTOPは、制御端末を書こうとするバックグラウンドプロセスグループにSIGTTOU信号を送信する.
PENDIN(POSIXに属していない;LINUXはサポートしていない)は、1文字を読み込むと、入力キューのすべての文字が再出力されます.(bashはtypeaheadを彼で処理します).
IEXTENは、カスタム入力処理の実装を有効にします.このフラグはICANONと同時に使用する必要があり、特殊文字EOL 2、LNEXT、REPRINT、WERASE、IUCLCフラグが有効であることを説明することができます.
次の例は、シリアルポートを設定する一般的な手順です.
#ifndef SETCOMCONFIG_H
#define SETCOMCONFIG_H

#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>


int set_com_config(int fd, int _speed, int data_bits, char parity, int stop_bits)
{
    struct termios comConfig;
    int baud_rate;

    if (tcgetattr(fd, &comConfig) < 0)
    {
        printf("%s tcgetattr
",strerror(errno)); return -1; } cfmakeraw(&comConfig); comConfig.c_cflag &= ~CSIZE; switch(_speed) { case 2400:baud_rate = B2400;break; case 4800:baud_rate = B4800;break; case 9600:baud_rate = B9600;break; case 19200:baud_rate = B38400;break; default: baud_rate = B115200; } cfsetispeed(&comConfig,baud_rate); cfsetospeed(&comConfig,baud_rate); switch(data_bits) { case 7:comConfig.c_cflag |= CS7;break; default: comConfig.c_cflag |= CS8; } switch(parity) { case 'o': case 'O': { comConfig.c_cflag |= (PARENB|PARODD); comConfig.c_iflag |= INPCK; }break; case 'e': case 'E': { comConfig.c_cflag |= PARENB; comConfig.c_cflag &= ~ PARODD; comConfig.c_iflag |= INPCK; }break; default: comConfig.c_cflag &= ~PARENB; } switch(stop_bits) { case 1: comConfig.c_cflag &= ~CSTOPB;break; default: comConfig.c_cflag |= CSTOPB; } comConfig.c_cc[VTIME] = 0; comConfig.c_cc[VMIN] = 1; tcflush(fd,TCIFLUSH); if (tcsetattr(fd,TCSANOW,&comConfig) != 0) { printf("%s tcsetattr
",strerror(errno)); return -1; } return 0; } #endif // SETCOMCONFIG_H