精华内容
下载资源
问答
  • window下,怎么查看串口被哪个进程占用,有什么方法或者软件可以协助查看吗? 串口不知被什么程序占用,有谁能帮我找出来吗 如何使用被其它程序占用的串口? 怎样查串口被个程序占用 如何清除W...

    一、常见提问

    如何解决串口(COM)被占用问题
    
    电脑串口号被占用,如何清除
    
    解决串口(COM)被占用问题
    
    我的电脑显示串口被占用,什么原因?
    
    串口端口被占用的解决方法
    
    串口被占用怎么办
    
    window下,怎么查看串口被哪个进程占用,有什么方法或者软件可以协助查看吗?
    
    串口不知被什么程序占用,有谁能帮我找出来吗
    
    如何使用被其它程序占用的串口?
    
    怎样查串口被个程序占用
    
    如何清除Win7中被占用的COM口 串口

    二、串口常见占用统计

    • 自己的软件存在BUG没有退出,可以在任务管理器中查看,修复自身软件bug;
    • 别的软件开机优先占用,此时需要找到占用串口的程序,卸载程序或删除;
    • USB转串口设备在使用过程热插拔,此时需要查看隐藏的串口,删除、重启计算机。
    • 莫名奇妙的Windows软件、硬件占用如:mstsc.exe、svchost.exe、控制面板-电话/调制解调选择-调制解调器、声卡等,这些占用情况,关闭或禁用基本能够解决占用情况,至于是怎么导致的,有可能是由于个人操作、硬件驱动、系统版本等原因导致。

     

    三、查看串口号是否正在使用中

    【Win+R】-运行-regedit

    计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter

    3.1ComDB二进制值说明

    ComDB为二进制数据,表示相应串口是否在使用状态。ComDB的数据规则为,COMn 在ComDB数据数值的使用标识为从左到有,第( (n-1)/8+1)列的1<<( (n-1) mode 8+1)位 。0标识无此串口,1标识此串口正在使用。

    每两位16进制数据为1列,m范围[0,31]:

    • 第m+1列的第1位标识COM[m*8+1]的使用状态;
    • 第m+1列的第2位标识COM[m*8+2]的使用状态;
    • 第m+1列的第3位标识COM[m*8+3]的使用状态;
    • 第m+1列的第4位标识COM[m*8+4]的使用状态;
    • 第m+1列的第5位标识COM[m*8+5]的使用状态;
    • 第m+1列的第6位标识COM[m*8+6]的使用状态;
    • 第m+1列的第7位标识COM[m*8+7]的使用状态;
    • 第m+1列的第8位标识COM[m*8+8]的使用状态。

    例:如下图,第30+1=31列数据为0x80,则标识COM [30*8+8]=COM248的串口号为正在使用状态。

    3.2重新分配串口号

    删除ComDB项,计算机会重建此字段,意味着重新分配所有串口号,如果没有生效可尝试重启计算机。

    四、查看隐藏的串口设备

    设备管理器中看不到此串口号,但又不能将其他串口设置为此串口号;一些USB设备热插拔后自动分配了更高的串口号;这些都是隐藏串口导致的,找到他们并删除,USB尽量避免热插拔。

    4.1设置显示硬件设备状态

    set devmgr_show_nonpresent_devices=1

    4.2显示隐藏的设备

    devmgmt.msc

    4.3删除隐藏占用的串口设备

    五使用DOS命令查看串口运行状态

    Mode

    六、查找占用串口的程序

    6.1准备好串口工具

    如:CEIWEI CommMonitor10.0.1.18011.rar

     

    6.2截获占用串口的程序PID

    安装好后监控所有串口,使用对应串口连接的下位机的功能,如“上电”、“断电”或“单片机自定义的弹片触发”等一切可能的功能,往上位机推送数据,此时监控工具会截获下位机往上位机推送的数据并显示在数据区,其中就包括了占用此串口程序进程的PID。

    6.3根据PID找到占用串口的程序

    任务栏【右键】-任务管理器-详细信息,根据监控工具所示的PID在任务管理器中可以找到对应占用此串口程序的名称。

    七、强制释放占用中的串口

    7.1方式一、在任务管理器中结束占用串口的程序

    任务栏【右键】-任务管理器-详细信息

     

    7.2方式二、先禁用后启用串口设备

    计算机【右键】-管理-计算机管理(本地)-系统工具-设备管理器-端口(COM和LPT)-通讯端口【右键】-禁用。

    计算机【右键】-管理-计算机管理(本地)-系统工具-设备管理器-端口(COM和LPT)-通讯端口【右键】-启用。

     

     

     

    7.3方式三、重启计算机

    展开全文
  • 这里的COM口是自动获取的可用串口,波特率,停止位这些都是可以设置的 接下来就说说我是怎么做的吧(这里面难点就在于自动com口,我写了两种方法,一种是遍历查询法,还有一种就是注册表查询法) 1.遍历查询法 1.1 ...

    效果图

    这里的COM口是自动获取的可用串口,波特率,停止位这些都是可以设置的,
    在这里插入图片描述
    接下来就说说我是怎么做的吧(这里面难点就在于自动com口,我写了两种方法,一种是遍历查询法,还有一种就是注册表查询法,注册表查询法请看下一章,里面都有对应的写好的程序)

    注意:这章是接着上章继续写的,程序用的也是上章的程序

    1.遍历查询法

    1.1 添加变量

    先将界面上的那些控件给加到面板上,然后修改ID以及变量名,不知道怎么弄的看我写的上一篇,变量名及ID修改如下,每个成员的ID其实就是他的英文名,
    在这里插入图片描述
    在这里需要将这些下拉框的属性改为如下,ID按照上面的就好
    在这里插入图片描述

    1.2 下拉框数据的写入

    在CShangWeiJiDlg::OnInitDialog()函数里面写入如下内容

    BOOL CShangWeiJiDlg::OnInitDialog()
    { 
    	CDialogEx::OnInitDialog();
    
    	// 将“关于...”菜单项添加到系统菜单中。
    
    	// IDM_ABOUTBOX 必须在系统命令范围内。
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    	//  执行此操作
    	SetIcon(m_hIcon, TRUE);			// 设置大图标
    	SetIcon(m_hIcon, FALSE);		// 设置小图标
    
    
    	// TODO: Add extra initialization here
    
    	AddCom();//向组合框中添加串口设备	
    	m_COM.SetCurSel(0);
    	//...
    
    
    	/*//COM口
    	m_COM.AddString(TEXT("COM1"));
    	m_COM.AddString(TEXT("COM2"));
    	m_COM.AddString(TEXT("COM3"));
    	m_COM.AddString(TEXT("COM4"));
    	m_COM.AddString(TEXT("COM5"));
    	m_COM.AddString(TEXT("COM6"));
    	m_COM.AddString(TEXT("COM7"));
    	m_COM.AddString(TEXT("COM8"));
    	m_COM.AddString(TEXT("COM9"));
    	m_COM.AddString(TEXT("COM10"));
    	m_COM.AddString(TEXT("COM11"));
    	m_COM.AddString(TEXT("COM12"));
    	m_COM.AddString(TEXT("COM13"));
    	//设置默认的选项
    	m_COM.SetCurSel(5);*/
    
    
    	//波特率
    	m_BaudRate.AddString(TEXT("1382400"));
    	m_BaudRate.AddString(TEXT("921600"));
    	m_BaudRate.AddString(TEXT("460800"));
    	m_BaudRate.AddString(TEXT("256000"));
    	m_BaudRate.AddString(TEXT("230400"));
    	m_BaudRate.AddString(TEXT("128000"));
    	m_BaudRate.AddString(TEXT("115200"));
    	m_BaudRate.AddString(TEXT("76800"));
    	m_BaudRate.AddString(TEXT("57600"));
    	m_BaudRate.AddString(TEXT("43000"));
    	m_BaudRate.AddString(TEXT("38400"));
    	m_BaudRate.AddString(TEXT("19200"));
    	m_BaudRate.AddString(TEXT("14400"));
    	m_BaudRate.AddString(TEXT("9600"));
    	m_BaudRate.AddString(TEXT("4800"));
    	m_BaudRate.AddString(TEXT("2400"));
    	m_BaudRate.AddString(TEXT("1200"));
    
    	//设置默认的选项
    	m_BaudRate.SetCurSel(6);
    
    
    	//停止位
    	m_StopBit.AddString(TEXT("1"));
    	m_StopBit.AddString(TEXT("1.5"));
    	m_StopBit.AddString(TEXT("2"));
    
    	//设置默认的选项
    	m_StopBit.SetCurSel(0);
    
    
    	//数据位
    	m_DataBit.AddString(TEXT("8"));
    	m_DataBit.AddString(TEXT("7"));
    	m_DataBit.AddString(TEXT("6"));
    	m_DataBit.AddString(TEXT("5"));
    
    	//设置默认的选项
    	m_DataBit.SetCurSel(0);
    
    
    
    	m_Parity.AddString(TEXT("无"));
    	m_Parity.AddString(TEXT("奇校检"));
    	m_Parity.AddString(TEXT("偶校检"));
    
    	//设置默认的选项
    	m_Parity.SetCurSel(0);
    
    
    
    	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    

    2. 获取COM口

    程序里面调用AddCom获取可用com口

    2.1插入AddCom函数

    在插入AddCom之前,我们需要定义三个变量,放在调用#include "xxxxx.h"文件之下

    CUIntArray ports, portse, portsu;
    

    同时还需要加上头文件,因为下面RefreshCom()这个函数的宏定义是这个头文件里面的

    #include <Dbt.h>
    

    然后在CShangWeiJiDlg.h中写入

    	void AddCom(void);
    

    然后在CShangWeiJiDlg.cpp里面写入

    void CShangWeiJiDlg::AddCom(void)
    {
    
    	EnumerateSerialPorts(ports, portse, portsu);
    	unsigned short uicounter;
    	unsigned short uisetcom;
    	CString str;
    
    	//获取可用串口个数
    	uicounter = portse.GetSize();
    	//如果个数大于0
    	if (uicounter > 0)
    	{
    		//初始化串口列表框
    		for (int i = 0; i < uicounter; i++)
    		{
    			uisetcom = portse.ElementAt(i);
    			str.Format(_T("COM%d "), uisetcom);
    			m_COM.AddString(str);
    		}
    	}
    }
    

    上面调用了EnumerateSerialPorts,所以我们需要插入这个函数

    2.2 插入EnumerateSerialPorts()函数

    在CShangWeiJiDlg.h中写入

    		void EnumerateSerialPorts(CUIntArray& ports, CUIntArray& portse, CUIntArray& portsu);//获取可用串口函数
    

    然后在CShangWeiJiDlg.cpp里面写入

    void CShangWeiJiDlg::EnumerateSerialPorts(CUIntArray& ports, CUIntArray& portse, CUIntArray& portsu)
    {
    	//清除串口数组内容
    	ports.RemoveAll();//所有存在串口
    	portse.RemoveAll();//可用串口
    	portsu.RemoveAll();//已占用串口
    
    	//因为至多有255个串口,所以依次检查各串口是否存在
    	//如果能打开某一串口,或打开串口不成功,但返回的是 ERROR_ACCESS_DENIED错误信息,
    	//都认为串口存在,只不过后者表明串口已经被占用
    	//否则串口不存在
    	for (int i = 1; i < 256; i++)
    	{
    		//Form the Raw device name
    		CString sPort;
    		sPort.Format(_T("\\\\.\\COM%d"), i);
    
    		//Try to open the port
    		BOOL bSuccess = FALSE;
    		HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    		if (hPort == INVALID_HANDLE_VALUE)
    		{
    			DWORD dwError = GetLastError();
    
    			if (dwError == ERROR_ACCESS_DENIED)
    			{
    				bSuccess = TRUE;
    				portsu.Add(i);       //已占用的串口
    			}
    		}
    		else
    		{
    			//The port was opened successfully
    			bSuccess = TRUE;
    			portse.Add(i);      可用的串口
    			//Don't forget to close the port, since we are going to do nothing with it anyway
    			CloseHandle(hPort);
    		}
    
    		//Add the port number to the array which will be returned
    		if (bSuccess)
    			ports.Add(i);   //所有存在的串口
    	}
    }
    

    2.3插入OnDeviceChange()以及RefreshCom()函数

    这两个函数应该是系统调用的,我试过不加,不加编译就不通过

    在CShangWeiJiDlg.h中写入

    	afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
    	void RefreshCom(void);
    

    然后在CShangWeiJiDlg.cpp里面写入

    BOOL CShangWeiJiDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
    {
    	//DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;
    	switch (nEventType)
    	{
    	case DBT_DEVICEREMOVECOMPLETE://移除设备
    	case DBT_DEVICEARRIVAL://添加设备
    		RefreshCom();//刷新组合框的内容
    		break;
    
    	default:
    		break;
    	}
    
    	return TRUE;
    
    }
    
    void CShangWeiJiDlg::RefreshCom(void)
    {
    	int count = m_COM.GetCount();
    
    	for (int i = 0; i < count; i++)
    	{
    		m_COM.DeleteString(count - 1 - i);
    	}
    	AddCom();
    	m_COM.SetCurSel(0);
    }
    

    3. 修改各个按键的作用以及添加读取下拉框的数据并处理函数

    3.1修改串口打开按钮按下的作用

    void CShangWeiJiDlg::OnBnClickedBtnopen()
    {
    	// TODO:  在此添加控件通知处理程序代码
    	if (m_Comm1.get_PortOpen())//获取串口工作状态,为0代表代开
    	{
    		m_Comm1.put_PortOpen(FALSE);//如果已经打开,就关闭串口
    		m_BtnOpen.SetWindowText(TEXT("打开串口"));//将打开串口按钮换成关闭串口
    	}
    	else
    	{
    /*		//拿到COM口索引
    		int Com = m_COM.GetCurSel()+1;
    		m_Comm1.put_CommPort(Com); //选择com,可根据具体情况更改*/
    
    
    		//当前端口号
    		int curPort = portse.ElementAt(m_COM.GetCurSel());//根据索引找到对应的com口编号
    		m_Comm1.put_CommPort(curPort);//端口号
    
    		m_Comm1.put_InBufferSize(1024); //设置输入缓冲区的大小,Bytes
    		m_Comm1.put_OutBufferSize(1024); //设置输入缓冲区的大小,Bytes//
    
    		CString Usart_Allcation = GetUsartAllcation();//获取串口参数配置
    		m_Comm1.put_Settings(Usart_Allcation); //波特率9600,无校验,8个数据位,1个停止位
    		m_Comm1.put_InputMode(1); //1:表示以二进制方式检取数据
    		m_Comm1.put_RThreshold(1);
    		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
    		m_Comm1.put_InputLen(0); //设置当前接收区数据长度为0
    
    		m_Comm1.put_PortOpen(TRUE);//打开串口
    		m_BtnOpen.SetWindowText(TEXT("关闭串口"));//将打开串口按钮换成关闭串口
    
    		m_Comm1.get_Input();//先预读缓冲区以清除残留数据
    	}
    
    	UpdateData(false);//将变量的内容同步到控件中
    }
    

    3.2写获取串口配置(波特率、校检位、数据位、停止位)

    这个需要在头文件中加入

    	CString GetUsartAllcation();
    
    然后在CShangWeiJiDlg.cpp里面加入
    
    //获取串口配置
    CString CShangWeiJiDlg::GetUsartAllcation()
    {
    	//拿到波特率的索引
    	int BaudRate = m_BaudRate.GetCurSel();
    	CString BaudRate_str;
    	m_BaudRate.GetLBText(BaudRate, BaudRate_str);//根据索引获取内容
    //	MessageBox(BaudRate_str);
    
    	//拿到停止位的索引
    	int StopBit = m_StopBit.GetCurSel();
    	CString StopBit_str;
    	m_StopBit.GetLBText(StopBit, StopBit_str);//根据索引获取内容
    //	MessageBox(StopBit_str);
    
    	//拿到拿到数据位的索引
    	int DataBit = m_DataBit.GetCurSel();
    	CString DataBit_str;
    	m_DataBit.GetLBText(DataBit, DataBit_str);//根据索引获取内容
    //	MessageBox(DataBit_str);
    
    	//拿到拿到奇偶校验位的索引
    	int Parity = m_Parity.GetCurSel();
    	char Parity_data;
    	switch (Parity)//根据索引设置校检位
    	{
    	case 0: Parity_data = 'N';//无
    		break;
    	case 1: Parity_data = 'O';//奇校检
    		break;
    	case 2: Parity_data = 'E';//偶校检
    		break;
    	default:
    		break;
    	}
    //	MessageBox(Parity_str);
    
    	//合并字符串
    	CString str;
    	str.Format(_T("%s,%c,%s,%s"), BaudRate_str, Parity_data, DataBit_str, StopBit_str);
    //	MessageBox(str);
    
    	return str;
    }
    

    4.写清除接收以及清除发送按钮的作用,

    4.1清除接收

    双击清除接收,程序会跳转到清除接收函数里面将其改为

    void CShangWeiJiDlg::OnBnClickedBtnsend3()
    {
    	// TODO:  在此添加控件通知处理程序代码
    	m_EditRxData.Empty();
    	UpdateData(FALSE);//从控件同步到控制台显示
    }
    

    4.2清除发送

    双击清除发送,程序会跳转到清除发送函数里面将其改为

    void CShangWeiJiDlg::OnBnClickedBtnsend2()
    {
    	// TODO:  在此添加控件通知处理程序代码
    	//点击清除发送执行的程序
    
    	m_EditTxData.Empty();
    	UpdateData(FALSE);//从控件同步到控制台显示
    }
    

    然后就大功告成了,本人已测试,按照教程来没问题,有问题的话欢迎大家指出哦

    写好的程序连接

    自己写好的程序:https://download.csdn.net/download/qq_40305944/12192872

    展开全文
  • 如果我确实插上了串口线在com3上,那么也能检测出com3,如果我在了串口5上,那么检测到的是com5和com3,很奇怪,这个时候com3也是不应该有的。 因为这些问题,导致很麻烦也不知道怎么解决 我的系统是win7,不过...
  •  一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些基础知识,如怎么用VC打开串口,如何对串口进行配置,读串口、写串口等。  这个类有点特别,它没有使用事件驱动...

    软件介绍

      一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些基础知识,如怎么用VC打开串口,如何对串口进行配置,读串口、写串口等。

      这个类有点特别,它没有使用事件驱动原理,它是以查询方式工作的。

    简介:   

      对没有接触过串口通信的VC程序员来说显得非常困难,很久以前我在 codeguru.com 上搜索过串口通信相关信息得到了非常大的帮助,从那时起能编写一个简单易用的VC 串口类是我的梦想。

      经过七个月在串口通信编程方面实践经验后,我编写了一个基于API实现的简单串口类,在介绍此串口类之前先介绍一下VC 串口通信方面的基础知识。

    串口通信基础:

      串口通信每个字节的传输以串行的方式进行,传输时低位先被发送,一个“包”由“开始位”+“数据位”+“奇偶校验位”(不是必需)+“停止位” 组成。

      奇偶校验位是可选的,它用来进行错误检测,您可以在软件里设置是否启用奇偶校验,而且还可以选择启用哪种校验方式,如“奇”校验(ODD)或“偶”校验(EVEN)。

      PC机通过串口发送和接收数据的流程如下:

      1、

    打开串口

      2、 配置串口通信参数,如:波特率、校验方式、数据位数等
      3、 设置通信超时时间
      4、 写数据
      5、 读数据
      6、 关闭串口

     

    用VC打开串口:

      打开串口可以用API函数 CreateFile() 来实现,打开串口有两种方式,分别为重叠I/O(OVERLAPPED)和非重叠(NON-OVERLAPPED)方式(其实这两种方式分别对应串口的异步和同步通信方式-VC串口通信技术网注)。CSerialCom 类工作于非重叠(NON-OVERLAPPED)模式(即同步通信模式),有关更多 OVERLAPPED NON-OVERLAPPED 方面的消息可查询MSDN。

    串口配置:

      VC 串口通信程序编写最重要的课题就是如何利用 DCB 结构来配置串口,对 DCB 结构填充不正确是大多数人常反犯的毛病,通常串口通信程序编写好后出现这样那样的问题就是因为这个结构没有正确填充所致。在利用 CreateFile() 函数打开串口时就需要我们对串口的波特率、校验方式、数据位、停止位等进行配置。

    设置超时时间:

      每次打开串口时都必须利用 COMMTIMEOUTS 结构设置超时时间,如果未设置此结构,通信将以默认或上次打开此串口时设置的超时时间为准。

    写串口:

      WriteFile() 函数可实现这一功能,在执行这一动作之前必须先打开并配置好串口。

    读串口:

      利用 ReadFile() 可实现这一功能,同样,在执行这一动作之前必须先打开并配置好串口。

    关闭串口:

      不再使用已经打开的串口后必须关闭它以将此串口资源释放出来,这样其它程序才可能再使用此串口资源,外于非重叠I/O(NON-OVERLAPPED)模式下的串口在打开期间是不能被其它程序或同一程序内的其它线程访问的。使用 CloseHandle() 函数可以关闭串口, CloseHandle() 函数只有一个参数,它是由 CreateFile() 打开串口时返回的设置句柄。

     

    CSerialCom 串口类

      CSerialCom 类使用六个函数来实现上面提到的功能,它们分别是:

    BOOL CSerialCom::OpenPort(CString portname)  
    {  
    portname= "//./" + portname;  
     
    hComm = CreateFile(portname,  
                          GENERIC_READ | GENERIC_WRITE,  
                          0,  
                          0,  
                          OPEN_EXISTING,  
                          0,  
                          0);  
    if(hComm==INVALID_HANDLE_VALUE){  
        return false;}  
        else 
        return true;  
     
    }  

     

      OpenPort()成员函数用来打开串口,它需要的参数只有一个,就是串口名,如“COM1”,“COM2” 。

     

    BOOL CSerialCom::ConfigurePort(DWORD BaudRate, BYTE ByteSize,   
                                   DWORD fParity, BYTE Parity, BYTE StopBits)  
    {  
        if((m_bPortReady = GetCommState(hComm, &m_dcb))==0)  
        {  
            MessageBox("GetCommState Error","Error",MB_OK+MB_ICONERROR);  
            CloseHandle(hComm);  
            return false;  
        }  
          
        m_dcb.BaudRate =BaudRate;  
        m_dcb.ByteSize = ByteSize;  
        m_dcb.Parity =Parity ;  
        m_dcb.StopBits =StopBits;  
        m_dcb.fBinary=TRUE;  
        m_dcb.fDsrSensitivity=false;  
        m_dcb.fParity=fParity;  
        m_dcb.fOutX=false;  
        m_dcb.fInX=false;  
        m_dcb.fNull=false;  
        m_dcb.fAbortOnError=TRUE;  
        m_dcb.fOutxCtsFlow=FALSE;  
        m_dcb.fOutxDsrFlow=false;  
        m_dcb.fDtrControl=DTR_CONTROL_DISABLE;  
        m_dcb.fDsrSensitivity=false;  
        m_dcb.fRtsControl=RTS_CONTROL_DISABLE;  
        m_dcb.fOutxCtsFlow=false;  
        m_dcb.fOutxCtsFlow=false;  
     
        m_bPortReady = SetCommState(hComm, &m_dcb);  
        if(m_bPortReady ==0)  
        {  
            MessageBox("SetCommState Error","Error",MB_OK+MB_ICONERROR);  
            CloseHandle(hComm);  
            return false;  
        }  
        return true;  
    }  

     

      ConfigurePort() 函数对串口地配置,它所需参数如下所示:

      DWORD BaudRate

      DWORD BaudRate 用来描述串口通信使用的波特率,如此参数为 CBR_9600 时,波特率为9600bps,PC机支持的标准波特率有:CBR_110 ,CBR_300 ,CBR_600 ,CBR_1200,CBR_2400,CBR_4800,CBR_9600,CBR_14400, CBR_19200,CBR_38400,CBR_56000,CBR_57600,CBR_115200,CBR_128000,CBR_256000

      BYTE ByteSize

      此参数描述数据位位数,标准值为8或4。

      DWORD fParity

      奇偶校验开关,如果此参数为真(TRUE)则开启奇偶校验,为假(FALSE)则关闭奇偶校验。

      BYTE Parity

      校验方式,可选方式如下:

     

    EVENPARITY

      MARKPARITY
      NOPARITY
      ODDPARITY
      SPACEPARITY

     

      BYTE StopBits

      停止位位数,可取值如下:

     

    ONESTOPBIT

      ONE5STOPBITS
      TWOSTOPBITS

     

    备注:ConfigurePort() 函数是假定串口的流控制是由硬件来完成的,软件在收发数据过程中不检测CTS/RTS 和 Xon/Xoff 状态,您可以修改DCB结构来启用软件流控制。

     

    BOOL CSerialCom::SetCommunicationTimeouts(DWORD ReadIntervalTimeout,   
                                              DWORD ReadTotalTimeoutMultiplier,   
                                              DWORD ReadTotalTimeoutConstant,   
                                              DWORD WriteTotalTimeoutMultiplier,   
                                              DWORD WriteTotalTimeoutConstant)  
    {  
        if((m_bPortReady = GetCommTimeouts (hComm, &m_CommTimeouts))==0)  
            return false;  
        m_CommTimeouts.ReadIntervalTimeout =ReadIntervalTimeout;  
        m_CommTimeouts.ReadTotalTimeoutConstant =ReadTotalTimeoutConstant;  
        m_CommTimeouts.ReadTotalTimeoutMultiplier =ReadTotalTimeoutMultiplier;  
        m_CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant;  
        m_CommTimeouts.WriteTotalTimeoutMultiplier =WriteTotalTimeoutMultiplier;  
        m_bPortReady = SetCommTimeouts (hComm, &m_CommTimeouts);  
          
        if(m_bPortReady ==0)  
        {  
            MessageBox("StCommTimeouts function failed",  
                       "Com Port Error",MB_OK+MB_ICONERROR);  
            CloseHandle(hComm);  
            return false;  
        }  
        return true;  
    } 
    

      SetCommunicationTimeouts() 成员函数用来设置读/写超时时间,它所需参数如下:

      DWORD ReadIntervalTimeout

      设置读串口时,收到两个字符的最大时间间隔,单位为毫秒。在执行ReadFile() 期间,一但收到两个字符的时间间隔超过这一设定值,ReadFile()立即返回。如果这一参数设置为零,则表明这一特性未启用。

      ReadTotalTimeoutConstant

      常量,用来计算读操作总超时时间。每个读操作过程中,这个参数被加到ReadTotalTimeoutMultiplier。如果ReadTotalTimeoutMultiplierReadTotalTimeoutConstant两个参数都为零则表明总超时计算功能没有启用。

      ReadTotalTimeoutMultiplier

      用来保存读操作总超时时间的

      WriteTotalTimeoutConstant

      常量,用来计算写操作总超时时间。与ReadTotalTimeoutConstant差不多。

      WriteTotalTimeoutMultiplier

      用来保存写操作总超时时间的,如果WriteTotalTimeoutMultiplierWriteTotalTimeoutConstant两参数均为零,表明写操作总超时时间特性不被启用。

      例如,您需要传送一块数据包,设定了写操作超时时间为500ms(每个字符间发送时间最大间隔),您可以用设置超时成员函数来设定,内容为:SetCommunicationTimeouts(0,500,0,0,0);如果设置成功,函数返回真,否则返回假。

    BOOL CSerialCom::WriteByte(BYTE bybyte)  
    {  
        iBytesWritten=0;  
        if(WriteFile(hComm,&bybyte,1,&iBytesWritten,NULL)==0)  
            return false;  
        else   
            return true;  
    } 

     

       WriteByte() 成员函数用来向串口写数据。

     

    BOOL CSerialCom::ReadByte(BYTE &resp)  
    {  
        BYTE rx;  
        resp=0;  
     
        DWORD dwBytesTransferred=0;  
     
        if (ReadFile (hComm, &rx, 1, &dwBytesTransferred, 0))  
        {  
            if (dwBytesTransferred == 1)  
            {  
                resp=rx;  
                return true;  
             }  
        }  
        return false;  
    } 
    View Code

     

    ReadByte() 成员函数实现读串口功能,如果您知道有数据发送来了,可能使用 ReadByte() 来读取数据,如果不知道何时有数据发送过来,可以周期性调用此函数,当没收到数据超过超时时间后, ReadByte() 自动返回。在实际应用中,通信双方可能会以某种协议进行的,此时一般有表明通信数据包结束的标志,如3964协议的结束符是‘ETX’,您可能通过它来判断是否传输结束。

    void CSerialCom::ClosePort()  
    {  
    CloseHandle(hComm);  
    return;  
    }  

     

      ClosePort() 成员函数用来关闭一个已经打开的串口。

    如何使用CSerialCom类

      使用CSerialCom类前的准备工作:

      1、

    复制SerialCom.h 和 SerialCom.cpp两个文件到工程所在目录

      2、 在VC工程中导入这两个文件
      3、 加入#include "SerialCom.h"句代码到程序适当位置
      4、 创建CSerialCom类的一个实例

      现在就可以调用CSerialCom类成员函数来进行串口通信了,操作流程如下: 

      1.  1 // 打开串口。 需要检查函数返回值来判断串口是否正确打开  
         2 port.OpenPort( );   
         3  
         4 // 配置串口。需要检查函数返回值来判断否正确配置  
         5 port.ConfigurePort( );    
         6  
         7 // 设置超时时间。需要检查函数返回值来判断否正确配置  
         8 port.SetCommunicationTimeouts( );   
         9        
        10 // 写串口,由于一次只能写一个字节,一般需要多次调用此函数才能将需要发送的字符串发送完  
        11 port.WriteByte();   
        12       
        13 // 读串口,由于一次只能读一个字节,一般需要多次调用此函数才能将需要读取的字符串读完  
        14 port.ReadByte( );   
        15  
        16 // 关闭串口  
        17 port.ClosePort();

         下载地址: http://pan.baidu.com/s/1mgzH428

    1.   (一个由印度人编写的VC++串口类_serialport+CSerialCom_demo)

    2. 参考:    http://cs.nju.edu.cn/yangxc/dcc2003.files/jszc-sub/comif-35.htm
    3.           http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm
    4.            http://www.vc-rs232.com/html/VC_SSCOM_Control/2011/0117/34.html

    转载于:https://www.cnblogs.com/lwngreat/p/4098374.html

    展开全文
  • 了资料上说,com口用的rs232电平,UART用的是TTL电平。然后呢, 我就找了一块rs232转TTL的转接板,原来驱动原原本本重新编译一下移植过去,不行。 这里面肯定有问题,两种不一样的接口,系统内核和触摸屏驱动...
  • c# 怎样监听已经打开的串口

    千次阅读 2010-10-23 21:48:00
    如题,用C#怎么实现监听已经打开的串口,我从网上都不能实现 实现监视需要的工作很多。你有这功夫,不如买一根1分2的线来做监视了。如果研究之用或是项目必须。要考虑api钩子,勾住createfile,...

    如题,用C#怎么实现监听已经打开的串口,我从网上查了查都不能实现

    实现监视需要的工作很多。你有这功夫,不如买一根1分2的线来做监视了。如果研究之用或是项目必须。要考虑api钩子,勾住createfile,readfile,writefile,KernelIoControl等相关的api,并自己重新封装数据,转发。
    当然,如果只是想实现效果,你当然还有折中的办法,下载一个SerialNull软件,虚拟串口,这样你虚拟一对串口,例如 COM8<-->COM9
    然后实际的比如想监视COM1。那你可以自己实现收COM1数据,转发给COM8,然后收COM8数据转发给COM1的操作,并同时,让另一个软件来操作COM9而不是真实的COM1。这样你自己做一个桥接软件。就可以在你的桥接软件中监视数据。当然,这个方法是我独创的,转载要注明:csdn.wuyazhe(逍遥)提供。以前做过类似的就是对GPS对应的端口进行监听,使用的就是createfile,readfile,writefile,KernelIoControl
    如果是你自己来调用打开的话,你可以使用SerialPort,来实现监听

    不是我自己调用,我是想监听已被别的程序打开的端口

    在一般的程序中内存的分配有5种,栈区、堆区、全局区、文字常量区和程序代码区。栈区是由编译器自动分配和释放,存放函数的参数值、局部变量的值等值类型的数据,其操作方式类似与数据结构中的栈。堆一般由程序员自动分配释放,若程序员不释放,程序结束时可能由操作系统自动回收,分配方式类似于数据结构中的链表,存放的是引用类型的值。

    现在需要做一个工业监控的东西,用户需求同时监测几十个变量的变化情况,因此会在UI上显示大量的chart,但每个chart本身可以很简单,很多都是只是0/1跳变,不需要很华丽的外观。快速,轻量级是主要的指标,请问大家有没有比较好的推荐~~~
    请问您觉得TeeChart性能怎么样? 如果同时给几十个变量绘制曲线,变量值每秒刷新一次,控件是否OK?
    我现在想实现这个功能,就是我电脑上有很多音乐,如果其他电脑的状态是在线,就把这些音乐发送给这些电脑。请问用C#怎么实现? 如何监控这些电脑的状态?有没有相应的类?能不能提供下思路 
    有必须的话可以采用异步响应的试,等收到对方的响应之后再传下一部分。
    我觉得可以用文件共享然后映射驱动器的方式,之后写一个服务,或者后台运行的程序检查该“虚拟硬盘”中的文件是否发生改动(这个在网上一搜一大片,另外,介绍IO的书里应该都有),一旦发现新文件就复制到本地就可以了。
    还有一种方法,lz把自己的机器建个Ftp服务器,把自己的音乐文件都扔到ftp的目录下。然后用c#写一个客户端,只要程序一启动,就自动连接你的ftp服务器,然后取回文件列表,和用户本地的列表做对比,如果有更新就自动下载。
    ftp客户端部分可以下一个命令行的ftp工具,然后用C#做一个shell就ok啦。
    使用socket就行了。别人电脑连接你电脑时,将会话保留着,就可以判断是不在线了。
    以前学过c,c++,工作了一直没用,用了六七年pb,现在要做.net,看点什么书比较实用,这么大年纪了还搞编程,真没前途
    C# 高级编程 是本很不错的书 看看吧 里面讲的挺详细的 哈哈
    如果底子比较好的话直接看<C# 高级编程 >,如果底子不好的话……报个培训班吧,还有人能请教一下……
    我也是最近也为选书烦恼得要死的人……现在国内大多数书都没怎么体谅到初学者的苦恼,一般直接给大段代码给你,简单的入门操作却完全不提……我之前看过第Wrox入门经典一版的觉得还行,后来有见过2、3版但没怎么看,因从事其他事情就没再看这些了
    学csharp ,你要学会忘记c,c++里面的一些东西。看一下 项目的源码 就行了 你一看就懂

    来源:足球直播
    展开全文
  • 本人做的项目需要串口通信,根据读取不同的值在数码管上显示不同的数字 ``` char buf; //定义串口发送的内容 //设置阴极接口 int a = 1; int b = 2; int c = 3; int d = 4; int e = 5; int f = 6; int g...
  • 今天调试Linuxde开发板,在Windows 环境串口登录,安装的...不会知道怎么改,上网了一下,原来这么简单: ,右键,在列表框里选择,进入到设备管理器: 双击,选择要修改的串口: 点击,然后点击:
  • ubuntu 串口号查询

    千次阅读 2013-12-02 12:02:46
    我们在windows中查找自己的开发板与电脑的连接的COM口时,可以通过查找设备管理器来看,但是换到咱们的linux系统中就不能这样做了,下面说一下在linux中是怎么查看COM口信息的。  首先,将我的mini2440开发板通过...
  • 我用的是Visual Studio 2012的MFC编程但是这个打开串口的函数m_comm.put_CommPort(com_num)只支持short类型啊!我在网上说是可以用 \\\\.\\COM41的方式打开,我要怎么改呢?
  • 用MFC写了个串口小程序,在其他人的电脑上怎么也运行不了,老弹出如下的框框: 在网上后,才知道是串口组件没有注册成功。 要想成功注册,得做如下几步: 1.从附件中以管理员身份打开命令行工具 2.用regsvr...
  • 测试了一下代码,发现怎么更改端口号都找不到设备,了一下树莓派USB端口设置, 然后发现需要对USB串口进行固定: 树莓派USB端口绑定 首先多次插拔确定USB端口: lsusb sudo gedit /etc/udev/rules.d/99-com.rules...
  • 之前在写IdGenerator工程的MFC软件是就发现按下Enter键,操作界面会自动退出的问题,当时没注意,指导最近在写一个串口调试终端的界面程序时又出现了类似问题,因此写下我是怎么解决这个问题的。  之所以按下Enter...
  • 第一种就是 8002 错误 ,你翻译一下就知道了,这是未找到端口错误,软件未找到你设置的com端口,软件打开默认搜索到的最小COM口号,如果您使用的电脑没有串口,是usb转换的虚拟串口,那么这个问题就经常出现,但是你...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
  • 我用的keil3编译环境,51单片机,电力线载波芯片是MI200E,测试接收0xaa是通过8个led灯(也用串口显示过,和led灯显示相匹配)第一次提问题,不知道怎么把MI200E的数据手册和应用手册贴出来,在代码后贴出了文档在...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    要实现单片机与电脑的连接,最简单的方式就是采用串口通讯,但需要加一颗RS-232芯片。 17. 在ARM编程中又应当如何? 答:就以嵌入式系统观念为例,一般嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

串口com怎么查