我正在开发一个项目,涉及在连接到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);
}
这个程序的输出是一个文本字符串,我对它100%满意(应该以Null结尾,有x个字符等) .
在Serial Communicator中键入从此程序获得的结果,它似乎不起作用!使用COM Spy 程序,我能够从终端应用程序获得“握手”协议 .
但是,似乎与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板 .
**** ********* 更新 ***********
感谢您的建议,事情是我不明白是为什么一个开源的硬件需要这么多的握手..也就是说,为什么只有最差的串行终端程序工作在串行通信器,提前串行监视器,terterm,终端等似乎没有用?
我已经更新了我的代码以完全镜像HyperTerminal(完成所有握手),但它似乎不起作用!
下面是更新后的代码片段:
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
}
结果 is exactly the same as the working result from HyperTerminal 除了没有时间条件 . 但是,在关闭端口之前,我在此代码之后使用了1秒的延迟 .
我的写声明是问题吗?
WriteFile(hDevice,c1,strlen(c1),&btsIO,NULL); //Write string to serial
看来我正在做的事情根本就出现了问题,我找不到它!
**** ***************** UPDATE2 ***************
我偶然发现了一些事情,我如何配置我的程序以单独发送每个字符?
Visual Studio不允许我删除Null或在代码中发送一个字符:
WriteFile(hDevice,c1,strlen(c1),&btsIO,NULL);//WRITE STRING TO SERIAL
我该如何解决这个问题?似乎Arduino板一次只接受一个字符 .
我已经将字符变量编辑为一个char等等!
**** ************* UPDATE3 ************************
这是监视来自Visual Studio 2010(或串行通信器)和HyperTerminal的通信的结果 . The issue is sending a bit at a time!
超级终端:
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 回答
自从我上次进行连续工作以来已经很长时间了 - 但在那些日子里,您的计算机上的软件必须与所需的硬件设备完全配置非常清楚 . 您的非工作示例并不完全符合电路板的要求 .
由于全功能计算机上的软件通常比嵌入式主板上的硬件更容易修改,因此查看串行软件中可用的配置选项是有意义的 - 任何可容忍的软件都将具有这些设置用 . 如果没有,我喜欢Qmodem和ProComm,虽然我有朋友坚持认为Telix是更好的工具 . (我为Telix制作了一些令人惊叹的Trade Wars脚本......)
正如一个建议:如果你学习了一些C#并使用.net API,它就可以很容易地访问串口...