C++ 在vc+;中,我需要使用哪些函数进行串行通信+;?
我正在处理一个被盗用的设备。我使用COM端口连接到它。 当我向它发送命令“list”时,它给出了所有文件的列表 所以我写了一个“hello world”,它将连接到端口设备并发送数据 当我连接我的设备并运行我的程序时,它正在写入端口,而没有从端口接收任何字节 但是,当我使用PUTTY打开COM端口(用于打开端口并发送一些数据)并发送命令时,它可以工作;当我关闭PUTTY并现在运行我的程序时,它可以正常工作,所以我需要第一次使用PUTTY打开端口,我的程序才能工作 可能我没有初始化某些函数…:( 有人能帮我解决这个问题吗,我在过去的一天里找不到解决办法。提前谢谢 我的源代码是:-C++ 在vc+;中,我需要使用哪些函数进行串行通信+;?,c++,visual-c++,mfc,serial-communication,C++,Visual C++,Mfc,Serial Communication,我正在处理一个被盗用的设备。我使用COM端口连接到它。 当我向它发送命令“list”时,它给出了所有文件的列表 所以我写了一个“hello world”,它将连接到端口设备并发送数据 当我连接我的设备并运行我的程序时,它正在写入端口,而没有从端口接收任何字节 但是,当我使用PUTTY打开COM端口(用于打开端口并发送一些数据)并发送命令时,它可以工作;当我关闭PUTTY并现在运行我的程序时,它可以正常工作,所以我需要第一次使用PUTTY打开端口,我的程序才能工作 可能我没有初始化某些函数…:(
#include "stdafx.h"
#include <iostream>
#include <afx.h>
int main()
{
using namespace std;
int i=0;
// cout << "Hello world!" << endl;
HANDLE hSerial;
hSerial = CreateFile("COM5",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if(hSerial==INVALID_HANDLE_VALUE)
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
// TRACE("serial port does not exist for reading\n");
//serial port does not exist. Inform user.
}
// TRACE("some other error,serial port does not exist for reading\n");
//some other error occurred. Inform user.
}
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams))
{
// TRACE("error getting state for reading\n");
//error getting state
}
dcbSerialParams.BaudRate=9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
dcbSerialParams.fOutX=TRUE;
dcbSerialParams.fInX=TRUE;
if(!SetCommState(hSerial, &dcbSerialParams))
{
//TRACE("error setting state for reading\n");
//error setting serial port state
}
COMMTIMEOUTS timeouts={0};
timeouts.ReadIntervalTimeout=50;
timeouts.ReadTotalTimeoutConstant=50;
timeouts.ReadTotalTimeoutMultiplier=10;
timeouts.WriteTotalTimeoutConstant=50;
timeouts.WriteTotalTimeoutMultiplier=10;
if(!SetCommTimeouts(hSerial, &timeouts))
{
// TRACE("some error occured for reading\n");
//error occureed. Inform user
}
int n=100,n1=100;
char szBuff[100];
DWORD dwBytesRead = 0;
char szBuff1[100];
DWORD dwByteswrote = 0;
memset(szBuff1,0,100);
memcpy(szBuff1,"LIST\r",5);
FlushFileBuffers(hSerial);
LPDWORD uf=0;
GetCommModemStatus(hSerial,uf);
TRACE("%d\n",uf);
if(!WriteFile(hSerial, szBuff1,5, &dwByteswrote, NULL))
{
cout << "error writing" ;
}
cout << szBuff1 << endl;
cout << dwByteswrote << endl;
dwByteswrote=0;
while(1)
{
if(!ReadFile(hSerial, szBuff, n1, &dwBytesRead, NULL))
{
cout << "error reading";
break;
}
else
{
cout << dwBytesRead << endl;
szBuff[dwBytesRead]='\0';
if(dwBytesRead>0)
{
cout << (szBuff);
break;
}
else
{
}
}
}
cin >> i;
}
#包括“stdafx.h”
#包括
#包括
int main()
{
使用名称空间std;
int i=0;
//库特
使用0作为通信资源(如COM端口)的dwShareMode的MSDN需求文档(您使用文件共享写入|文件共享读取
)。请先尝试此操作。即使没有帮助,也最好遵循官方文档
如果(1)不起作用,那么尝试使用CREATE_ALWAYS而不是OPEN_EXISTING。文档要求实际OPEN_EXISTING,但一条社区消息(在官方文档之后)建议对LPT端口使用CREATE_ALWAYS(尽管可能不同)
您可以尝试设置所有DCB选项并清除端口错误
// Common settings
dcbSerialParams.DCBlength = sizeof( dcbSerialParams );
dcbSerialParams.ByteSize = 8;
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.fParity = FALSE;
dcbSerialParams.Parity = NOPARITY;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.fDtrControl = 0;
dcbSerialParams.fRtsControl = 0;
// If you say so
dcbSerialParams.fOutX = TRUE;
dcbSerialParams.fInX = TRUE;
// Not so common settings
dcbSerialParams.fBinary = FALSE;
dcbSerialParams.fParity = FALSE;
dcbSerialParams.fOutxCtsFlow = FALSE;
dcbSerialParams.fOutxDsrFlow = FALSE;
dcbSerialParams.fDsrSensitivity = FALSE;
dcbSerialParams.fErrorChar = FALSE;
dcbSerialParams.fNull = FALSE;
dcbSerialParams.fAbortOnError = FALSE;
// Clear errors
unsigned long ulCommErr = 0;
ClearCommBreak( hSerial );
ClearCommError( hSerial, &ulCommErr, NULL );
可能与此无关,但我注意到我在序列代码中为CreateFile()添加了一个安全描述符,我相信Windows Server的某些配置需要它
// Allow access
SECURITY_ATTRIBUTES sa, *pSa = NULL;
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = (SECURITY_DESCRIPTOR*)LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH);
if ( sa.lpSecurityDescriptor
&& InitializeSecurityDescriptor( (SECURITY_DESCRIPTOR*)sa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION )
&& SetSecurityDescriptorDacl( (SECURITY_DESCRIPTOR*)sa.lpSecurityDescriptor, TRUE, (PACL)NULL, FALSE ) )
pSa = &sa;
// Open the port
hSerial = CreateFile( x_pPort,
GENERIC_READ | GENERIC_WRITE,
0,
pSa,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
if ( pSa )
LocalFree( pSa->lpSecurityDescriptor );
我看到您正在调用SetCommState
和SetCommTimeouts
,但您确定您正在使用正确的值进行初始化吗?例如波特率、位、奇偶校验、rd/wr超时等。此外,发送命令后可能需要一点时间才能应答,因此请尝试在读取文件
调用之前放置睡眠
在一段时间内继续从端口发出叮当声(1)循环,直到我读取了一些字节,这样就不会有数据延迟到达的问题。当我第一次用putty打开端口并关闭该端口,然后运行我的程序时,我的程序运行正常。putty正在对我丢失的端口进行一些初始化…我想不出来…thnx为了获得帮助,我添加了initializat解决了这个问题DCB中每个数据成员的权限…:)