【发布时间】:2023-03-30 15:14:01
【问题描述】:
我正在尝试在我的电脑和 arduino ATmega2560 之间进行一些串行通信
首先是微控制器的程序:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.write('A');
}
arduino 程序非常基础,他的目的是检查电脑上的下一个程序。
main.cpp:
#include <iostream>
#include "SerialPort.h"
using namespace std;
int main()
{
SerialPort port("com3", 9600);
while (1)
{
//Receive
unsigned char dataR;
port.receive(dataR, 1);
cout << dataR << endl;
}
return 0;
}
SerialPort.h:
#include <windows.h>
#include <iostream>
class SerialPort
{
public:
//Constructors
SerialPort();
SerialPort(const char* port, unsigned long BaudRate);
//Initialization
void Initialize(const char* port, unsigned long BaudRate);
//Serial I/O
void receive(unsigned char &data, unsigned int byteSize);
void transmit(unsigned char *data, unsigned int byteSize);
//State
void connect();
void disconnect();
bool isConnected();
//Destructor
~SerialPort();
private:
HANDLE handler;
bool isConnect;
};
还有 SerialPort.cpp:
#include "SerialPort.h"
/*Constructors*/
SerialPort::SerialPort()
: isConnect(false) {}
SerialPort::SerialPort(const char* port, unsigned long BaudRate)
: isConnect(false)
{
Initialize(port, BaudRate);
}
/*Initialization*/
void SerialPort::Initialize(const char* port, unsigned long BaudRate)
{
handler = CreateFile(port, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (handler == INVALID_HANDLE_VALUE)
{
std::cout << "ERROR!::Error during opening port" << port << std::endl;
return;
}
DCB serialParameters;
if (!GetCommState(handler, &serialParameters)) /*Get com parameters*/
{
std::cout << "ERROR!::failed to get current serial parameters" << std::endl;
return;
}
serialParameters.DCBlength = sizeof(DCB);
serialParameters.BaudRate = BaudRate;
serialParameters.ByteSize = 1; /*8 bit data format*/
serialParameters.StopBits = TWOSTOPBITS;
serialParameters.Parity = PARITY_NONE;
if (!SetCommState(handler, &serialParameters)) /*Send modified com parameters*/
{
std::cout << "ALERT!:Failed to set THE Serial port parameters" << std::endl;
return;
}
isConnect = true;
PurgeComm(handler, PURGE_RXCLEAR | PURGE_TXCLEAR);
}
/*Serial I/O*/
void SerialPort::receive(unsigned char &data, unsigned int byteSize)
{
ReadFile(handler, &data, byteSize, NULL, NULL);
}
void SerialPort::transmit(unsigned char *data, unsigned int byteSize)
{
WriteFile(handler, data, byteSize, NULL, NULL);
}
/*State*/
void SerialPort::connect()
{
isConnect = true;
}
void SerialPort::disconnect()
{
isConnect = false;
}
bool SerialPort::isConnected()
{
return isConnect;
}
/*Destructors*/
SerialPort::~SerialPort()
{
if (isConnect)
{
isConnect = false;
CloseHandle(handler);
}
}
我对这个程序有疑问:我没有收到正确的数据。我应该在哪里到达终端
A
A
A
...
我得到了奇怪的字符?在一个正方形中
希望你能理解我的问题 谢谢
【问题讨论】:
-
并且您没有检查任何错误。例如,可能是您的
ReadFile失败(在最后一个参数中同时使用 0 是错误的) -
这是您评论 RbMn 之后的新接收方法:
-
对不起,我弄错了.... 新方法是 void SerialPort::receive(unsigned char &data, unsigned int byteSize) { DWORD read; ReadFile(handler, &data, byteSize, &read, NULL); std::cout
-
它说读取了一个字节,我也打印了相同的字符
-
也许这个旧答案中的代码会有所帮助:stackoverflow.com/a/6037377/179910