怎样用DOS命令检查COM口状态?
答案:2 悬赏:70 手机版
解决时间 2021-11-28 11:47
- 提问者网友:辞取
- 2021-11-27 20:15
怎样用DOS命令检查COM口状态?
最佳答案
- 五星知识达人网友:鱼忧
- 2021-11-27 21:27
netstat /a
全部回答
- 1楼网友:低音帝王
- 2021-11-27 22:05
其实有很多硬件设备在DOS下不需安装任何的驱动程序,只要硬件或将BIOS设置好就可使用,如键盘,普通的硬盘和支持PCL(打印机控制语言)的打印机等。在DOS下使用支持PCL的打印机非常容易,因为打印机连接在并行端口(LPT)上,所以通常LPT1或PRN就是打印机端口。比如COPY C:\\CONFIG.SYS LPT1命令(当然也可直接使用PRINT C:\\CONFIG.SYS命令)就可将C:\\CONFIG.SYS文件中的内容用打印机打印出来。大家看,是不是很方便呢?当然,要在一些DOS应用程序中打印出更好的效果(如各种字体,图像等),还需要专门的打印机驱动程序,在这些应用程序中的“打印机设置”中选择合适的打印机即可。
和打印机类似的是调制解调器。调制解调器是电脑拨号上网时的必用设备,分为内置和外置两大类。外置调制解调器通常接在电脑的串行端口(通信端口COM)上,如COM2。传统的内置调制解调器通常也可以自动虚拟串行端口,所以和外置调制解调器的使用相差不大。DOS下有大量与调制解调器有关的通信程序,如果调制解调器接在COM3上,使用这些程序时使用COM3就行了。如果您想在DOS下用简单的命令测试一下调制解调器,可用ECHO ATDT12345>COM3(假设调制解调器连在COM3上),这时它就会拨号(12345),使用也非常方便。然而,随着硬件的发展,许多非传统的新型调制解调器出现了。这些新型调制解调器没有硬件控制器,需要用软件虚拟,所以叫软件调制解调器,或叫WinModem。原来ISA接口的调制解调器大多是传统的硬件调制解调器,而PCI接口的调制解调器则有许多是软件调制解调器。软件调制解调器和硬件调制解调器相比,由于没有硬件控制器,所以成本要低些,但是性能自然要差些,而且需要驱动程序才可运行。所以,在DOS下必须装载相应的驱动程序才可使用。但由于这些调制解调器主要是为Win9x设计的,所以大多都没有DOS下驱动程序,所以无法在纯DOS下使用,不过有很多调制解调器通过虚拟可在Win9x的DOS窗口下使用。
还有些硬件设备是有自己的调试命令,说检测的话,只能用系统提供的API才能做到!
下面就拿串口控制来举例说明这个过程:
1.打开设备
HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
参数说明:
-lpFileName:要打开的文件名称。对串口通信来说就是COM1或COM2。
-dwDesiredAccess:读写模式设置。此处应该用GENERIC_READ及GENERIC_WRITE。
-dwShareMode:串口共享模式。此处不允许其他应用程序共享,应为0。
-lpSecurityAttributes:串口的安全属性,应为0,表示该串口不可被子程序继承。
-dwCreationDistribution:创建文件的性质,此处为OPEN_EXISTING.
-dwFlagsAndAttributes:属性及相关标志,这里使用异步方式应该用FILE_FLAG_OVERLAPPED。
-hTemplateFile:此处为0。
操作说明:若文件打开成功,串口即可使用了,该函数返回串口的句柄,以后对串口操作时
即可使用该句柄。
例子
HANDLE hComm;
hComm=CreateFile("\\\\.\\COM1", //串口号
GENERIC_READ|GENERIC_WRITE, //允许读写
0, //通讯设备必须以独占方式打开
NULL, //无安全属性
OPEN_EXISTING, //通讯设备已存在
FILE_FLAG_OVERLAPPED, //异步I/O
0); //通讯设备不能用模板打开
hComm即为函数返回的串口1的句柄。
2.关闭设备
BOOL CloseHandle(HANDLE hObjedt)
参数说明:
-hObjedt:串口句柄
操作说明:成功关闭串口时返回true,否则返回false
3.获取设备参数(这里是串口的)
BOOL GetCommState(HANDLE hFile,
LPDCB lpDCB);
参数说明:
-hFile:串口句柄
-lpDCB:设备控制块(Device Control Block)结构地址。此结构中含有和设备相关的
参数。此处是与串口相关的参数。由于参数非常多,当需要设置串口参数
时,通常是先取得串口的参数结构,修改部分参数后再将参数结构写入。
在此仅介绍少数的几个常用的参数:
DWORD BaudRate:串口波特率
DWORD fParity:为1的话激活奇偶校验检查
DWORD Parity:校验方式,值0~4分别对应无校验、奇校验、偶校验、校验
置位、校验清零
DWORD ByteSize:一个字节的数据位个数,范围是5~8
DWORD StopBits:停止位个数,0~2分别对应1位、1.5位、2位停止位
例子
DCB ComDCB; //串口设备控制块
GetCommState(hComm,&ComDCB);
4.设置串口状态
BOOL SetCommState(HANDLE hFile,
LPDCB lpDCB);
参数说明:
-hFile:串口句柄
-lpDCB:设备控制块(Device Control Block)结构地址。要更改的串口参数包含在此结构中。
例子
DCB ComDCB;
GetCommState(hComm,&ComDCB);//取得当前串口状态
ComDCB.BaudRate=9600;//更改为9600bps,该值即为你要修改后的波特率
SetCommState(hComm,&ComDCB;//将更改后的参数写入串口
5.现在才到最关心的地方,设备的写
BOOL WriteFile(HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);
参数说明:
-hFile:串口句柄
-lpBuffer:待写入数据的首地址
-nNumberOfBytesToWrite:待写入数据的字节数长度
-lpNumberOfBytesWritten:函数返回的实际写入串口的数据个数的地址,利用此变量可判断
实际写入的字节数和准备写入的字节数是否相同。
-lpOverlapped:重叠I/O结构的指针
例子
DWORD BytesSent=0;
unsigned char SendBytes[5]={1,2,3,4,5};
WriteFile(hComm, //调用成功返回非零,失败返回零
SendBytes, //输出缓冲区
5, //准备发送的字符长度
&BytesSent, //实际发出的字符数
NULL); //重叠结构
//如果函数执行成功的话检查BytesSent的值应该为5,此函数是WriteFile函数执行完毕后
//自行填充的,利用此变量的填充值可以用来检查该函数是否将所有的数据成功写入串口
6.读
BOOL ReadFile(HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
lpNumberOfBytesRead,
lpOverlapped);
参数说明:
-hFile:串口句柄
-lpBuffer:存储被读出数据的首地址
-nNumberOfBytesToRead:准备读出的字节个数
-NumberOfBytesRead:实际读出的字节个数
-lpOverlapped:异步I/O结构。
例子
unsigned char ucRxBuff[20];
COMSTAT ComStat;
DWORD dwError=0;
DWORD BytesRead=0;
ClearCommError(hComm,&dwError,&ComStat);//检查串口接收缓冲区中的数据个数
bResult=ReadFile(hComm, //串口句柄
ucRxBuff, //输入缓冲区地址
ComStat.cbInQue, //想读入的字符数
&BytesRead, //实际读出的字节数的变量指针
NULL); //重叠结构指针
//假如当前串口中有5个字节数据的话,那么执行完ClearCommError()函数后,ComStat
//结构中的ComStat.cbInQue将被填充为5,此值在ReadFile函数中可被直接利用。
和打印机类似的是调制解调器。调制解调器是电脑拨号上网时的必用设备,分为内置和外置两大类。外置调制解调器通常接在电脑的串行端口(通信端口COM)上,如COM2。传统的内置调制解调器通常也可以自动虚拟串行端口,所以和外置调制解调器的使用相差不大。DOS下有大量与调制解调器有关的通信程序,如果调制解调器接在COM3上,使用这些程序时使用COM3就行了。如果您想在DOS下用简单的命令测试一下调制解调器,可用ECHO ATDT12345>COM3(假设调制解调器连在COM3上),这时它就会拨号(12345),使用也非常方便。然而,随着硬件的发展,许多非传统的新型调制解调器出现了。这些新型调制解调器没有硬件控制器,需要用软件虚拟,所以叫软件调制解调器,或叫WinModem。原来ISA接口的调制解调器大多是传统的硬件调制解调器,而PCI接口的调制解调器则有许多是软件调制解调器。软件调制解调器和硬件调制解调器相比,由于没有硬件控制器,所以成本要低些,但是性能自然要差些,而且需要驱动程序才可运行。所以,在DOS下必须装载相应的驱动程序才可使用。但由于这些调制解调器主要是为Win9x设计的,所以大多都没有DOS下驱动程序,所以无法在纯DOS下使用,不过有很多调制解调器通过虚拟可在Win9x的DOS窗口下使用。
还有些硬件设备是有自己的调试命令,说检测的话,只能用系统提供的API才能做到!
下面就拿串口控制来举例说明这个过程:
1.打开设备
HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
参数说明:
-lpFileName:要打开的文件名称。对串口通信来说就是COM1或COM2。
-dwDesiredAccess:读写模式设置。此处应该用GENERIC_READ及GENERIC_WRITE。
-dwShareMode:串口共享模式。此处不允许其他应用程序共享,应为0。
-lpSecurityAttributes:串口的安全属性,应为0,表示该串口不可被子程序继承。
-dwCreationDistribution:创建文件的性质,此处为OPEN_EXISTING.
-dwFlagsAndAttributes:属性及相关标志,这里使用异步方式应该用FILE_FLAG_OVERLAPPED。
-hTemplateFile:此处为0。
操作说明:若文件打开成功,串口即可使用了,该函数返回串口的句柄,以后对串口操作时
即可使用该句柄。
例子
HANDLE hComm;
hComm=CreateFile("\\\\.\\COM1", //串口号
GENERIC_READ|GENERIC_WRITE, //允许读写
0, //通讯设备必须以独占方式打开
NULL, //无安全属性
OPEN_EXISTING, //通讯设备已存在
FILE_FLAG_OVERLAPPED, //异步I/O
0); //通讯设备不能用模板打开
hComm即为函数返回的串口1的句柄。
2.关闭设备
BOOL CloseHandle(HANDLE hObjedt)
参数说明:
-hObjedt:串口句柄
操作说明:成功关闭串口时返回true,否则返回false
3.获取设备参数(这里是串口的)
BOOL GetCommState(HANDLE hFile,
LPDCB lpDCB);
参数说明:
-hFile:串口句柄
-lpDCB:设备控制块(Device Control Block)结构地址。此结构中含有和设备相关的
参数。此处是与串口相关的参数。由于参数非常多,当需要设置串口参数
时,通常是先取得串口的参数结构,修改部分参数后再将参数结构写入。
在此仅介绍少数的几个常用的参数:
DWORD BaudRate:串口波特率
DWORD fParity:为1的话激活奇偶校验检查
DWORD Parity:校验方式,值0~4分别对应无校验、奇校验、偶校验、校验
置位、校验清零
DWORD ByteSize:一个字节的数据位个数,范围是5~8
DWORD StopBits:停止位个数,0~2分别对应1位、1.5位、2位停止位
例子
DCB ComDCB; //串口设备控制块
GetCommState(hComm,&ComDCB);
4.设置串口状态
BOOL SetCommState(HANDLE hFile,
LPDCB lpDCB);
参数说明:
-hFile:串口句柄
-lpDCB:设备控制块(Device Control Block)结构地址。要更改的串口参数包含在此结构中。
例子
DCB ComDCB;
GetCommState(hComm,&ComDCB);//取得当前串口状态
ComDCB.BaudRate=9600;//更改为9600bps,该值即为你要修改后的波特率
SetCommState(hComm,&ComDCB;//将更改后的参数写入串口
5.现在才到最关心的地方,设备的写
BOOL WriteFile(HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);
参数说明:
-hFile:串口句柄
-lpBuffer:待写入数据的首地址
-nNumberOfBytesToWrite:待写入数据的字节数长度
-lpNumberOfBytesWritten:函数返回的实际写入串口的数据个数的地址,利用此变量可判断
实际写入的字节数和准备写入的字节数是否相同。
-lpOverlapped:重叠I/O结构的指针
例子
DWORD BytesSent=0;
unsigned char SendBytes[5]={1,2,3,4,5};
WriteFile(hComm, //调用成功返回非零,失败返回零
SendBytes, //输出缓冲区
5, //准备发送的字符长度
&BytesSent, //实际发出的字符数
NULL); //重叠结构
//如果函数执行成功的话检查BytesSent的值应该为5,此函数是WriteFile函数执行完毕后
//自行填充的,利用此变量的填充值可以用来检查该函数是否将所有的数据成功写入串口
6.读
BOOL ReadFile(HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
lpNumberOfBytesRead,
lpOverlapped);
参数说明:
-hFile:串口句柄
-lpBuffer:存储被读出数据的首地址
-nNumberOfBytesToRead:准备读出的字节个数
-NumberOfBytesRead:实际读出的字节个数
-lpOverlapped:异步I/O结构。
例子
unsigned char ucRxBuff[20];
COMSTAT ComStat;
DWORD dwError=0;
DWORD BytesRead=0;
ClearCommError(hComm,&dwError,&ComStat);//检查串口接收缓冲区中的数据个数
bResult=ReadFile(hComm, //串口句柄
ucRxBuff, //输入缓冲区地址
ComStat.cbInQue, //想读入的字符数
&BytesRead, //实际读出的字节数的变量指针
NULL); //重叠结构指针
//假如当前串口中有5个字节数据的话,那么执行完ClearCommError()函数后,ComStat
//结构中的ComStat.cbInQue将被填充为5,此值在ReadFile函数中可被直接利用。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯