Arduino和Windows串行通信的问题?

我正在开发一个项目,涉及一些Visual Studio 2010 Proffesional在连接到Arduino Mega设备的Windows 7 32位平台(用于控制一些与问题无关的硬件**)上实现的“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); } 

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

在串行通讯器上键入从该程序中获得的结果,似乎不起作用! 使用COM间谍程序,我能够从terminal应用程序获得“握手”协议。

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

以下“握手”是从超级terminal(这是工作!!)

 * 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 * 

这是从串行通讯(这是行不通的,不正确的和不一致的数字):

 * 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板。

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

感谢您的build议,事情是我不明白为什么一个开源的硬件会需要这么多的握手。也就是说,为什么只有最糟糕的串行terminal程序工作的地方串行通讯器,先进的串行监视器,terterm,terminal等似乎没有工作?

我已经更新了我的代码,以准确地镜像超级terminal(完成所有的握手),但似乎不起作用!

下面是更新的代码fragement:

 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 } 

除了没有时序条件外,其结果与超级terminal的工作结果完全一致 。 但是,在closures端口之前,我已经在此代码之后使用了1秒的延迟。

我写的声明有问题吗?

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

看来我正在做一些根本性的错误,而我找不到它!

** * ** * ** * **** UPDATE2 * ** * ** * ** * *

我已经偶然发现了一些事情,我将如何configuration我的程序来单独发送每个字符?

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

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

我该如何解决这个问题? 似乎Arduino董事会一次只接受一个angular色。

我已经编辑了字符variables是一个字符等!

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

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

超级terminal:

 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秒。

自从我上次做串行工作已经很长时间了 – 但是那段时间清楚,您的计算机上的软件必须完全按照所需的硬件设备进行配置。 您的非工作示例没有提出DTR或RTS,而这正是董事会所要求的。

由于全功率计算机上的软件通常比嵌入式主板上的硬件更易于修改,因此查看串行软件中可用的配置选项是有意义的 – 任何可容忍的软件都将具有这些设置用。 如果不是,我喜欢Qmodem和ProComm ,尽管我有些朋友坚持认为Telix是更好的工具。 (我有一些Telix的贸易战脚本,真是太棒了…)

正如一个建议:如果你学习一些C#和使用.net API的,它可以很容易地访问串行端口…