文章目录

  • 前言
  • 1. 创建一个对话框
  • 2. Windows下使用非标准波特率
  • 2.1获取串口号
  • 2.2 获取设置的非标波特率
  • 2.3 打开串口



前言

我们在使用USB转串口设备进行通讯时候,常用的标准波特率有9600bps,19200bps,115200bps,230400bps和921600bps等波特率。但有些场景下也会使用非标准波特率,如100000bps,200000bps,1Mbps,和4Mbps等波特率。下面简单的介绍一种方法,如何使用非标波特率。


1. 创建一个对话框

使用VC6++ 进行编程,创建一个对话框,在界面上添加组合框,用于显示搜索到串口设备。然后设置组合框属性点击样式,紧接着选择类型下面的下移属性,这样设置的好处就是可以自定义输入非标准波特率。设置步骤如下图所示:

Android UsbDevice设置波特率 usb支持的波特率_组合框

2. Windows下使用非标准波特率

使用VC6++ 进行编程,创建一个对话框,在界面上添加组合框,用于显示搜索到串口设备。然后设置组合框属性点击样式,紧接着选择类型下面的下移属性,这样设置的好处就是可以自定义输入非标准波特率。设置步骤如下图所示:

2.1获取串口号

因为打开串口需要获取设备的端口号(COMX或COMXX),而界面上的组合框是显示串口设备友好名称和COM端口号,所以还要进行一个步骤提取COM端口号。

Android UsbDevice设置波特率 usb支持的波特率_端口号_02


代码如下:

INT i,BegainSer,EndSer,Len;
	std::string strTemp,strComName;
	CHAR ComName[16] = "";
	CHAR tempBuf[256] = "";
	CHAR buf[256] = "";
	//提取设备友好名称中的COM号
	GetDlgItemText(hWnd,IDC_Com,tempBuf,sizeof(tempBuf));
	Len =strlen(tempBuf);
	strTemp = tempBuf;
	BegainSer = strTemp.find('(');
	EndSer = strTemp.find(')');
	for(i=0; i<EndSer-BegainSer-1; i++)
	{
		ComName[i] = tempBuf[BegainSer+1+i];
	}
	strComName += "\\\\.\\";
	strComName += ComName;

2.2 获取设置的非标波特率

波特率设置可以选取组合框列表中列出的波特率,也可以自己输入波特率,如非标准波特率。

//提取组合框中的波特率参数。
CHAR BaudrateBuffer[16] = "";
ULONG BaudRate;
GetDlgItemText(hWnd, IDC_BaudRate, BaudrateBuffer, sizeof(BaudrateBuffer));
BaudRate = atoi(BaudrateBuffer); //字符串转为整数

2.3 打开串口

//使用2.1和2.2小节获取的参数代入下面的函数中去,以及数据位,停止位和校验位。

BOOL OpenUART(LPCTSTR ComName, int BaudRate, int DataBits, int StopBits, int Parity)
{
	DCB dcb; //设置串口参数的结构体
	COMMTIMEOUTS Timeouts;
	
	//打开串口
	hCom = CreateFile(ComName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
	if(hCom == INVALID_HANDLE_VALUE)
	{
		MessageBox(hWnd,"打开串口失败!","UartTest",MB_ICONWARNING);
		return FALSE;
	}
	CommStat = TRUE;
	RecvFlag = TRUE;
	//设置串口缓冲区
	SetupComm(hCom,4096,4096);
	//设置读写超时
	Timeouts.ReadIntervalTimeout         = 100;
	Timeouts.ReadTotalTimeoutMultiplier  = 500;
	Timeouts.ReadTotalTimeoutConstant    = 0;
	Timeouts.WriteTotalTimeoutMultiplier = 0;
	Timeouts.WriteTotalTimeoutConstant   = 0;
	SetCommTimeouts(hCom, &Timeouts);
	//设置串口参数
	GetCommState(hCom,&dcb);
	//设置波特率
	dcb.BaudRate = BaudRate;
	//设置数据位
	switch(DataBits)
	{
	case 0:
		dcb.ByteSize = 5;
		break;
	case 1:
		dcb.ByteSize = 6;
		break;
	case 2:
		dcb.ByteSize = 7;
		break;
	case 3:
		dcb.ByteSize = 8;
		break;
	}
	//设置停止位
	switch(StopBits)
	{
	case 0:
		dcb.StopBits = ONESTOPBIT;
		break;
	case 1:
		dcb.StopBits = ONE5STOPBITS;
		break;
	case 2:
		dcb.StopBits = TWOSTOPBITS;
		break;
	}
	//设置校验位
	switch(Parity)
	{
	case 0:
		dcb.Parity = NOPARITY; //无校验
		break;
	case 1:
		dcb.Parity = ODDPARITY; //奇校验
		break;
	case 2:
		dcb.Parity = EVENPARITY; //偶检验
		break;
	case 3:
		dcb.Parity = MARKPARITY; //标志1校验
		break;
	case 4:
		dcb.Parity = SPACEPARITY; //空白校验
		break;
	}
	SetCommState(hCom,&dcb);
	PurgeComm(hCom,PURGE_TXABORT|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_RXCLEAR);
	return TRUE;
}

这样串口设备就可以使用非标准波特进行设备间通讯了,参数设置如下图所示:

Android UsbDevice设置波特率 usb支持的波特率_端口号_03