【问题标题】:is WriteFile working ? C++WriteFile 工作吗? C++
【发布时间】:2017-03-02 12:26:07
【问题描述】:

我必须通过串口向设备发送 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);
}

当我需要在我的设备中执行命令时,我调用函数 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; .......... 的东西。我想我的问题是这样的。

【问题讨论】:

  • 您决定放弃所有返回值。生命短暂,无法猜测问题所在,零信息。
  • (LPCVOID)data, - 这当然是错误(访问冲突)需要WriteFile(hPort, &amp;data, sizeof(data), &amp;byteswritten, NULL);
  • @IInspectable,你需要什么样的信息?我把我认为有必要的都说了。
  • 看起来你决定忽略文档中的细节。你为什么决定这样做?
  • 这让我觉得很奇怪。我链接到解释如何做到这一点的文档。点击超链接真的要求太多了吗?

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


【解决方案1】:
void uart::write(char data) {

WriteFile(hPort,
    (LPCVOID)data,
    1,
    &byteswritten,
    NULL);
}

你明白你在这里做什么吗?您传递 0-255 范围内的缓冲区地址,这当然是无效的,并且不指向您的实际数据。当内核检查您的缓冲区时 - 引发异常 STATUS_ACCESS_VIOLATION ,由 win32 转换为 ERROR_NOACCESS。此错误代码必须在您调用WriteFile 后返回GetlastError(),返回false

您需要下一个函数来写入 1 个字节:

DWORD uart::write(char data) {

DWORD byteswritten;
return WriteFile(hPort,
    &data,
    sizeof(data),
    &byteswritten,
    NULL) ? NOERROR : GetLastError();
}

不确定这一切是否会正常工作(代码中没有其他错误)但必须完成此修复

【讨论】:

  • 非常感谢您花时间帮助我。
  • 我一直在阅读有关串行端口的信息,但我不知道当传递一个字符时 writefile 在做什么。起初,WriteFile 使用参数 CString,我决定更改它,因为我的设备使用二进制协议,我认为 CString 没有发送正确的数据值。关于 STATUS_ACCESS_VIOLATION 和 ERROR_NOACCESS 从未向我展示过。阅读 cmets 我确信我需要一些函数来知道发生了什么。我在哪里可以读到这些?
  • @Th3venin - WriteFile 总是将 指针 指向某个缓冲区(和缓冲区大小)。你不能pass a char 它。您只能将 pointer 传递给 char。写文件后你打电话给GetLastError 吗?
  • 谢谢@RbMm!我的程序正在处理这些更改。 void uart::write(BYTE data){ WriteFile(hPort, &data, 1, &byteswritten, NULL); } BYTE 主页[] = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 };诠释 i = 0; for (i = 0; i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2023-01-12
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多