【发布时间】:2021-06-18 03:25:14
【问题描述】:
我正在开发与微控制器通信的 Windows 窗体应用程序。以前我的项目是基于 arduino nano 的,它运行完美。现在我正在切换到带有 arduino 内核(STM32duino)的 STM32,并且在 Windows 窗体应用程序中通过串行接收数据时遇到了问题。现在我正在使用 nucelo32 L432 板进行测试,同时连接到该板的 Serial(0) 端口。让我们从我的 arduino 代码开始:
extern "C" void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {};
/* Initializes the RCC Oscillators according to the specified parameters
in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = 0;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 40;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
/* Initializes the CPU, AHB and APB buses clocks */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) {
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1;
PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI;
PeriphClkInit.PLLSAI1.PLLSAI1M = 1;
PeriphClkInit.PLLSAI1.PLLSAI1N = 24;
PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7;
PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2;
PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2;
PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
Error_Handler();
}
/* Configure the main internal regulator output voltage */
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) {
Error_Handler();
}
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
Serial.println("A");
digitalWrite(LED_BUILTIN, HIGH);
}
}
如您所见,它首先初始化时钟,以便串行在 PC 中作为虚拟 com 端口可见,然后以 9600 的波特率和 LED_BUILTIN 引脚初始化串行。然后当它接收到任何串行数据时,它应该输出到串行字母“H”并打开LED。
我将它上传到板上并使用 arduino 串行监视器和 PuTTy 进行测试 - 按预期工作 - 一旦它通过串行接收到任何内容,它就会输出“h”并且板载 LED 亮起。
现在让我们来看看我的 Windows 窗体测试应用程序。这只是一个简单的表单,带有组合框来选择我想连接的com端口,刷新按钮来刷新com端口列表,连接按钮将初始化连接,发送按钮将通过串行发送“H”和标签以显示“ Received something" 当它将通过串行接收任何东西时: Form layout
该表格的代码:
公共部分类 Form1 : Form {
string IncomingData;
public Form1()
{
InitializeComponent();
serialPort1.DataReceived += serialPort1_DataReceived;
foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
{
comboBox1.Items.Add(s);
}
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
IncomingData = serialPort1.ReadLine();
this.Invoke(new EventHandler(ReceivedDataHandle));temperatury
}
private void ReceivedDataHandle(object sender, EventArgs e)
{
label1.Text = "Received something";
}
private void button1_Click(object sender, EventArgs e)
{ //connect button
try
{
serialPort1.BaudRate = 9600;
serialPort1.PortName = comboBox1.Text;
serialPort1.NewLine = "\r\n";
serialPort1.Open();
Thread.Sleep(1000);
MessageBox.Show("Connected");
}
catch (Exception)
{
MessageBox.Show("Error - connection problem");
}
}
private void button2_Click(object sender, EventArgs e)
{ //Send button
try
{
serialPort1.WriteLine("H");
}
catch (Exception)
{
MessageBox.Show("Error - connection problem");
}
}
private void button3_Click(object sender, EventArgs e)
{ //refresh button - get com ports
comboBox1.Items.Clear();
foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
{
comboBox1.Items.Add(s);
}
}
}
我已经使用 Arduino NANO 对其进行了测试,它可以正常工作 - 在 arduino 通过串行接收“H”后,它通过串行“A”发送,打开板载 LED 并且 label1 文本更改为“接收到的东西”,但使用 nucleo登机 奇怪的事情发生了... 按下发送按钮后,nucleo 板上的 LED 亮起,因此它收到了“H”,但 label1 表单应用程序没有收到任何回复 - label1 不会更改文本。我也把断点放在了行中:
IncomingData = serialPort1.ReadLine();
然后使用 arduino 应用程序停止并进入“调试检查”,而使用 nucleo 则不会,所以我假设表单没有收到任何数据。 那么...我可以尝试什么?如何解决?
@@更新:
问题可能已解决。我必须添加serialPort1.DTREnabled = true 和serialPort1.RTSEnabled = true。
我忘了stm32duino不握手......
如果有任何问题,将进行更多测试并报告。
【问题讨论】:
-
如果解决了,你应该把你的解决方案放在一个答案中,这样其他人可以从中学习。
标签: c# forms arduino connection stm32