我必须向串口中的设备发送6个字节。端口已打开但数据未发送。我使用串口监视器来了解我的代码(C ++ Win32,Visual Studio)会发生什么。
我正在使用CreateFile
hPort = CreateFile( TEXT("COM3"),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL );
我要写的代码是:
void uart::write(char data) {
WriteFile(hPort,
(LPCVOID)data,
1,
&byteswritten,
NULL);
}
当我需要在我的设备中执行命令时,我调用fuction sendCommand(“000000010000000100000000000000000000000000000000”);
void device::sendCommand(std::string command) {
int size = command.length();
char* string = (char*)command.c_str();
std::vector<char> data(command.begin(), command.end()) ;
std::cout <<"[Uart.write]>>\n";
int j=0;
for (int k = 0; k <= size - 1; k++) {
Uart.write(data[k]);
std::cout << data[k];
j++;
if (j % 8 == 0 && j!=0) { std::cout << "__byte " << j / 8 << "send___\n";
}
我使用下一个代码作为模型来编写上面的代码win32 c ++。
#using <System.dll>
using namespace System;
using namespace System::IO::Ports;
using namespace System::Threading;
void SendCommand(SerialPort^ port, Byte unit, Byte command, Int32 data);
int _tmain(int argc, _TCHAR* argv[])
{
SerialPort^ port;
Byte unit;
Byte command;
Int32 data;
// Set up serial port
port = gcnew SerialPort();
port->PortName = "COM8";
port->BaudRate = 9600;
port->DataBits = 8;
port->Parity = Parity::None;
port->StopBits = StopBits::One;
port->Handshake = Handshake::None;
// Open port
port->Open();
// Home device 1
SendCommand(port, 1, CMD_HOME, 0);
WaitForReply(port, 1, CMD_HOME, unit, command, data);
// Close port
port->Close();
return 0;
}
void SendCommand(SerialPort^ port, Byte unit, Byte command, Int32 data)
{
array<Byte>^ packet = gcnew array<Byte>(6);
gcnew array<Byte>
packet[0] = unit;
packet[1] = command;
packet[2] = data & 0xFF;
packet[3] = (data >> 8) & 0xFF;
packet[4] = (data >> 16) & 0xFF;
packet[5] = (data >> 24) & 0xFF;
port->Write(packet, 0, 6);
}
我想在C ++中找到像array<Byte>^ packet = gcnew array<Byte>(6);
gcnew array<Byte>
packet[0] = unit; ..........
这样的东西。我认为我的问题是。
答案 0 :(得分:1)
void uart::write(char data) {
WriteFile(hPort,
(LPCVOID)data,
1,
&byteswritten,
NULL);
}
你知道你在这做什么吗?你传递0-255范围内的缓冲区地址,这当然是无效的,并没有指向你的实际数据。当内核检查你的缓冲区时 - 引发异常STATUS_ACCESS_VIOLATION
,由win32转换为ERROR_NOACCESS
。致电GetlastError()
后,此错误代码必须返回WriteFile
。{/ p>
你需要写1字节的下一个函数:
false
不确定是否会在此之后全部工作(代码中没有其他错误)但必须完成此修复