📄 com_c.txt
字号:
1.com口打开与关闭
打开:
#if defined (WIN32)
devID = (int)CreateFile(devname, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);
#elif defined (__unix)
devID = open(devname, O_RDWR|O_NOCTTY|O_NONBLOCK);
#endif
如果打开成功还有设置com模式,也就是初始化设置com口
unix下的,id指devID
void SetCommMode(int id, CHANPARA *chpp)
{
struct termios tty_termios, tty_tt;
bzero(&tty_termios, sizeof(tty_termios));
tty_termios.c_cc[VMIN] = 1;
tty_termios.c_cc[VTIME] = 0;
tty_termios.c_cflag |= CLOCAL;
tty_termios.c_cflag |= CREAD;
tty_termios.c_cflag |= CS8;
if(chpp->stopbit) tty_termios.c_cflag |= CSTOPB;
if(chpp->checkbit)
{
if(chpp->checkbit == 1)
{
tty_termios.c_cflag |= PARENB;
tty_termios.c_cflag |= PARODD;
}
else tty_termios.c_cflag |= PARENB;
}
switch(chpp->baud)
{
case 300: tty_termios.c_cflag |= B300 ; break;
case 600: tty_termios.c_cflag |= B600 ;break;
case 1200: tty_termios.c_cflag |= B1200 ;break;
case 2400: tty_termios.c_cflag |= B2400 ;break;
case 4800: tty_termios.c_cflag |= B4800 ;break;
case 9600: tty_termios.c_cflag |= B9600 ;break;
case 19200: tty_termios.c_cflag |= B19200 ;break;
default:break;
}
#if defined(_AIX)
if((tcsetattr(id, TCSANOW, &tty_termios) == -1))
{
perror("tcsetattr() failed at TCSANOW");
}
#else
ioctl(id, TCSETS, &tty_termios);
#endif
}
NT下的
void SetCommMode(int id, CHANPARA *chpp)
{
DCB dcb;
COMMPROP commprop;
COMMTIMEOUTS timeouts;
GetCommProperties((HANDLE)id, &commprop);
GetCommState((HANDLE)id, &dcb);
switch(chpp->baud)
{
case 300: dcb.BaudRate = CBR_300; break;
case 600: dcb.BaudRate = CBR_600; break;
case 1200: dcb.BaudRate = CBR_1200; break;
case 2400: dcb.BaudRate = CBR_2400; break;
case 4800: dcb.BaudRate = CBR_4800; break;
case 9600: dcb.BaudRate = CBR_9600; break;
case 19200: dcb.BaudRate = CBR_19200; break;
}
if(chpp->databit == 0) dcb.ByteSize = 7;//7位数据位
else dcb.ByteSize = 8;//8位数据位
if(chpp->stopbit == 1) dcb.StopBits = 0; //1;
else if(chpp->stopbit == 2) dcb.StopBits = 2; //2
else if(chpp->stopbit == 3) dcb.StopBits = 1;
if(chpp->checkbit == 0) dcb.Parity = 0 ; //NOPARITY;
else
{
if(chpp->checkbit == 1) dcb.Parity = 1;
else if(chpp->checkbit == 2) dcb.Parity = 2;
}
dcb.fOutxCtsFlow = FALSE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState((HANDLE)id, &dcb);
//set timeout
GetCommTimeouts((HANDLE)id, &timeouts);
memset(&timeouts, 0, sizeof(timeouts));
timeouts.ReadIntervalTimeout = MAXDWORD;
SetCommTimeouts((HANDLE)id, &timeouts);
}
//devname只设备地址com口
关闭:
#if defined (WIN32)
ret = CloseHandle((HANDLE)devID );
if(ret == 0) return FALSE;
else return TRUE;
#else
ret = close(devID );
if(ret == 0) return TRUE;
else return FALSE;
#endif
2.com口读写
NT下读:
COMSTAT comstat;
DWORD nBytesRead;
unsigned long dwError;
int nBytes, ret;
ClearCommError((HANDLE)devId, &dwError, &comstat);
if(comstat.cbInQue > MAX_RXTXBYTE-1) nBytes = MAX_RXTXBYTE-1;
else nBytes = comstat.cbInQue;
ReadFile((HANDLE)devId, inbuff, nBytes, &nBytesRead, NULL);
ret = nBytesRead;
NT下写:
char *outBuff;
int nWrites, ret;
unsigned long nActualWrite;
ret = WriteFile((HANDLE)devId, outBuff, cnt, &nActualWrite, NULL);
if(!ret) nWrites = -1;
else nWrites = nActualWrite;
unix下读
short len;
int bytes;
bytes = read((int)devId, buffer, MAX_RXTXBYTE-1);
if(bytes < 0)
{
int err = get_last_error();
if(err == EWOULDBLOCK || err == DF_EINTR)
unix下写:
ret = write(devId, buff, cnt);
bytes = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -