⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 com_c.txt

📁 一个很好的串口通信程序
💻 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 + -