C++ 使用C+的RS-232串行通信+;以及如何将LabView VI转换为c++;代码

C++ 使用C+的RS-232串行通信+;以及如何将LabView VI转换为c++;代码,c++,C++,我试图开发一个程序来控制湖岸331温度控制器。基本上,我使用了一些文献中的Createfile()、Writefile()和Readfile结构。一个月后,我想我可以打开一个端口,写一些单词,但从来没有读过任何东西。我怀疑波特率、奇偶校验、停止位(我无法通过DCB真正控制)以及时间的问题。另一方面,在LV中,只要使用一个小程序,就可以正常工作。这里,我想问一下,有没有人可以把这个LV基本代码转换成C++,或者纠正我的旧C++程序,我会很感激。 这是我的C++代码,注意,如果我写单词*IDN,程序

我试图开发一个程序来控制湖岸331温度控制器。基本上,我使用了一些文献中的Createfile()、Writefile()和Readfile结构。一个月后,我想我可以打开一个端口,写一些单词,但从来没有读过任何东西。我怀疑波特率、奇偶校验、停止位(我无法通过DCB真正控制)以及时间的问题。另一方面,在LV中,只要使用一个小程序,就可以正常工作。这里,我想问一下,有没有人可以把这个LV基本代码转换成C++,或者纠正我的旧C++程序,我会很感激。

这是我的C++代码,注意,如果我写单词*IDN,程序应该说“LS331…”,但什么也没发生

int main(){

HANDLE hSerial;
HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);

char datarecv[3];
char szBuff[2]={0}; //= {0};
DWORD dwBytesRead;
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
BOOL fSuccess;



DWORD dwWritten, dwReading;


hSerial = CreateFile("COM4",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);

 COMMTIMEOUTS timeouts;                   

  timeouts.ReadIntervalTimeout = 1;
  timeouts.ReadTotalTimeoutMultiplier = 1;
  timeouts.ReadTotalTimeoutConstant = 1;
  timeouts.WriteTotalTimeoutMultiplier = 1;
  timeouts.WriteTotalTimeoutConstant = 1;
  if (!SetCommTimeouts(hSerial, &timeouts))
  PrintError("E014_SetCommtimeout failed");
GetCommState(hSerial, &dcbSerialParams);
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.fDtrControl = DTR_CONTROL_ENABLE;
dcbSerialParams.fRtsControl = RTS_CONTROL_ENABLE;
dcbSerialParams.fOutxCtsFlow = 1;
dcbSerialParams.fRtsControl = DTR_CONTROL_HANDSHAKE;

dcbSerialParams.Parity = 1;
dcbSerialParams.StopBits = TWOSTOPBITS;
dcbSerialParams.ByteSize = 8;

SetCommState(hSerial, &dcbSerialParams);


static const char *buf={"*IDN?"};
char buff[7];
char bufff[10];
 DWORD read = 0;
 int writee=6;
 DWORD write=64; // Number of bytes to write to serial port
 //buf[0] = 2; // Decmial value to write to serial port

WriteFile(hSerial,buf,writee,&write,NULL); 
printf("write=%i\n",write);
ReadFile(hSerial,&bufff,100,&dwReading,NULL);
printf("write=%i\n",bufff);


//DWORD i;
//for (i=0; i<read; i++)
//printf("%i ", (unsigned char)buff[6]);




  CloseHandle(hSerial);
intmain(){
处理串行;
手柄屏幕=GetStdHandle(标准输出手柄);
char-datarecv[3];
char szBuff[2]={0};//={0};
德沃德·德比特斯雷德;
DCB dcbSerialParams={0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
成功;
德沃德写的,德沃德读的;
hSerial=CreateFile(“COM4”,泛型读写,0,0,打开现有,0,0);
通信超时;
timeouts.ReadIntervalTimeout=1;
timeouts.readTotalTimeout乘数=1;
timeouts.ReadTotalTimeoutConstant=1;
timeouts.WriteTotalTimeout乘数=1;
timeouts.WriteTotalTimeoutConstant=1;
如果(!SetCommTimeout(hs串行和超时))
打印错误(“E014_SetCommtimeout失败”);
GetCommState(hSerial和dcbSerialParams);
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.fDtrControl=DTR\u CONTROL\u ENABLE;
dcbSerialParams.frtControl=RTS\u CONTROL\u ENABLE;
dcbSerialParams.fOutxCtsFlow=1;
dcbSerialParams.frtControl=DTR\U控制\U握手;
dcbSerialParams.奇偶校验=1;
dcbSerialParams.StopBits=两个停止位;
dcbSerialParams.ByteSize=8;
SetCommState(hSerial和DCBSERIALPARAM);
静态常量char*buf={“*IDN?”};
字符buff[7];
char-buff[10];
DWORD read=0;
int writee=6;
DWORD write=64;//要写入串行端口的字节数
//buf[0]=2;//要写入串行端口的十进制值
WriteFile(hSerial、buf、writeee和write,NULL);
printf(“写入=%i\n”,写入);
ReadFile(hSerial,&buff,100,&dwReading,NULL);
printf(“write=%i\n”,bufff);
//德沃德一世;
//对于(i=0;i>>程序显示LS331


提前感谢您

您努力设置了DCB,然后立即通过调用
GetCommState
覆盖它。将订单更改为:

getCommState(hSerial, &dcbSerialParams);
dcbSerialParams.BaudRate=CBR_9600;
...
dcbSerialParams.ByteSize = 8;
SetCommState(hSerial, &dcbSerialParams);

这将解决通信设置问题。

您对GetCommState的调用将覆盖您在dcbSerialParams中所做的所有设置。您必须在设置参数之前调用GetCommState


WriteFile和ReadFile调用应该使用COM端口句柄,而不是Std句柄。

我将GetCommstate向上移动到DCB上方,然后将我的句柄屏幕替换为hSerial,但它们不会给出任何响应。getcomstate似乎有错误,读取字节=0。如何解决此问题?如果您不显示更改了代码并且没有显示确切的错误消息?当我将getCommstate移到所有DCB之上时,在编译时似乎有错误,为什么?