WriteFile工作吗? C ++

时间:2017-03-02 12:26:08

标签: c++ visual-studio winapi serial-port

我必须向串口中的设备发送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; ..........这样的东西。我认为我的问题是。

1 个答案:

答案 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

不确定是否会在此之后全部工作(代码中没有其他错误)但必须完成此修复