Arduino和Windows串口通信问题?

时间:2011-11-19 00:16:59

标签: c windows visual-studio-2010 serial-port arduino

我正在开发一个项目,涉及在连接到Arduino Mega设备的Windows 7 32位平台上的Visual Studio 2010 Proffesional中实现的某些'c'串行通信(控制与问题无关的某些硬件**)。这个代码的工作原理是100%;我遇到的唯一问题是我的串口通信正在发生一些非常有趣的事情。

Visual C程序如下。

HANDLE hDevice = CreateFile(L"COM5",
                            GENERIC_READ | GENERIC_WRITE,
                            FILE_SHARE_READ | FILE_SHARE_WRITE,
                            NULL,
                            OPEN_EXISTING,
                            0,
                            0); //Open COM handle (create file)
if (hDevice !=INVALID_HANDLE_VALUE) //If COM3 connected
{
    printf("Com port opened\n");
    DCB lpTest;
    GetCommState(hDevice,&lpTest);
    lpTest.BaudRate = CBR_9600;
    lpTest.ByteSize = 8;
    lpTest.Parity = NOPARITY;
    lpTest.StopBits = ONESTOPBIT;
    SetCommState(hDevice,&lpTest);
    DWORD btsIO;
    WriteFile(hDevice,c1,strlen(c1),&btsIO,NULL);
    CloseHandle(hDevice);
}

这个程序的输出是一个文本字符串,我对它很满意(应该以Null结尾,有x个字符等)。

在Serial Communicator中键入从此程序获得的结果,它似乎不起作用!使用COM间谍程序,我能够从终端应用程序中获得“握手”协议。

然而,似乎与Arduino板的通信在HyperTerminal上工作,而不是在串行通信器或任何其他串行应用程序上工作(Arduino板上没有握手等**不相关)。

以下“握手”是从HyperTerminal(THIS WORKS !!)获得的

*
COM port is opened
In/out queue size 8192/8192
Baud rate 9600
DTR on
Data bits=8, Stop bits=1, Parity=None
Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
Handflow: ControlHandShake=(DTR_CONTROL, CTS_HANDSHAKE, ERROR_ABORT), FlowReplace=    (TRANSMIT_TOGGLE, RTS_HANDSHAKE, XOFF_CONTINUE), XonLimit=80, XoffLimit=200
Set timeouts: ReadInterval=10, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0,     WriteTotalTimeoutMultiplier=0,     WriteTotalTimeoutConstant=5000
*

这是来自Serial Communicator(它不起作用;数字不正确和不一致):

*
COM port is opened
In/out queue size 2048/2048
Baud rate 9600
RTS off
DTR off
Data bits=8, Stop bits=1, Parity=None
Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
Handflow: ControlHandShake=(), FlowReplace=(), XonLimit=80, XoffLimit=200
Set timeouts: ReadInterval=0, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0,     WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0
*

我显然可以看到差异,但需要知道如何使Arduino板独立于这些“握手”协议。 (DTR,时间等)

这是我的Visual Studio程序(不起作用;数字不正确和不一致)

*
COM port is opened
Baud rate 9600
RTS off
DTR off
Data bits=8, Stop bits=1, Parity=None
Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
Handflow: ControlHandShake=(), FlowReplace=(), XonLimit=80, XoffLimit=200
*

因此,我想让Arduino板远离DTR和所有握手,因为我希望最终的实现能够直接从Visual Studio“讲话”到Arduino板。

** * ** 更新 * ** * ***

感谢您的建议,事情是我不明白为什么开源硬件需要这么多的握手..也就是说,为什么只有最差的串行终端程序工作在串行通信器,提前串行监视器,第一个,终端等似乎没有用?

我已更新我的代码以完全镜像超级终端(完成所有握手),但它似乎不起作用!

见下更新的代码片段:

HANDLE hDevice = CreateFile(L"COM5",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ |     FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0); //Open COM handle (create file)
if (hDevice !=INVALID_HANDLE_VALUE) //If COM3 connected
{
    printf("Com port opened\n"); //Show it's open
    DCB lpTest;
    // Initialize the DCBlength member.
    lpTest.DCBlength = sizeof (DCB);
    GetCommState(hDevice,&lpTest); //com state
    lpTest.BaudRate = CBR_9600;//load baud
    lpTest.ByteSize = 8;// load no. bits
    lpTest.Parity = NOPARITY;//parity
    lpTest.StopBits = ONESTOPBIT;//stop bits

    lpTest.fBinary = FALSE;            // Binary mode; no EOF check
    lpTest.fOutxCtsFlow = TRUE;         // No CTS output flow control
    lpTest.fOutxDsrFlow = FALSE;         // No DSR output flow control
    lpTest.fDtrControl = DTR_CONTROL_ENABLE;  // DTR flow control type
    lpTest.fDsrSensitivity = FALSE;      // DSR sensitivity
    lpTest.fTXContinueOnXoff = TRUE;     // XOFF continues Tx
    lpTest.fOutX = FALSE;                // No XON/XOFF out flow control
    lpTest.fInX = FALSE;                 // No XON/XOFF in flow control
    lpTest.fErrorChar = FALSE;           // Disable error replacement
    lpTest.fNull = FALSE;                // Disable null stripping
    //lpTest.fRtsControl = RTS_CONTROL_ENABLE; //// RTS flow control
    lpTest.fAbortOnError = TRUE;        // Do not abort reads/writes on error
    SetCommState(hDevice,&lpTest);
    DWORD btsIO;
    //ETC
}

结果与HyperTerminal 的工作结果完全相同,只是没有时间条件。但是,在关闭端口之前,我在此代码之后使用了1秒的延迟。

我的写声明是否存在问题?

WriteFile(hDevice,c1,strlen(c1),&btsIO,NULL); //Write string to serial

似乎我正在做的事情根本就是错误的,我找不到它!

** * ** * ** * 的**** UPDATE2 * ** * ** * ** < EM> * *

我偶然发现了一些事情,我如何配置我的程序以单独发送每个字符?

Visual Studio不允许我删除Null或在代码中发送一个字符:

 WriteFile(hDevice,c1,strlen(c1),&btsIO,NULL);//WRITE STRING TO SERIAL

如何解决此问题?看起来Arduino板一次只能接受一个字符。

我已经将字符变量编辑为一个char等等!

** * ** * *** UPDATE3 * ** * ** * ** * ** * ** * ** * *

这是监视来自Visual Studio 2010(或串行通信器)和HyperTerminal的通信的结果。 问题是一次发送一点!

超级终端:

Baud rate 9600
DTR on
Data bits=8, Stop bits=1, Parity=None
Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
Handflow: ControlHandShake=(DTR_CONTROL, CTS_HANDSHAKE, ERROR_ABORT), FlowReplace=    (TRANSMIT_TOGGLE, RTS_HANDSHAKE, XOFF_CONTINUE), XonLimit=80, XoffLimit=200
Set timeouts: ReadInterval=10, ReadTotalTimeoutMultiplier=0,     ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=5000

和程序/串行通信:

Baud rate 9600
DTR on
Data bits=8, Stop bits=1, Parity=None
Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
Handflow: ControlHandShake=(DTR_CONTROL, CTS_HANDSHAKE, ERROR_ABORT), FlowReplace=    (TRANSMIT_TOGGLE, RTS_HANDSHAKE, XOFF_CONTINUE), XonLimit=80, XoffLimit=200

在程序代码中等待X秒。

2 个答案:

答案 0 :(得分:2)

自从我上次进行连续工作以来已经有很长一段时间了 - 但是当时非常很清楚,那时你的计算机上的软件被完全配置为所需的硬件设备。你的非工作示例没有提出DTR或RTS,这正是董事会似乎需要的。

由于全功能计算机上的软件通常比嵌入式主板上的硬件更容易修改,因此查看串行软件中可用的配置选项是有意义的 - 任何可容忍的软件都将具有这些选项摆弄的设置。如果没有,我喜欢QmodemProComm,但我有朋友坚持认为Telix是更好的工具。 (我为Telix制作了一些令人惊叹的Trade Wars脚本......)

答案 1 :(得分:0)

正如一个建议:如果您学习了一些C#并使用.net API,那么访问串口很容易......