【问题标题】:C# Windows forms app - not receiving serial data from nucleo32 L432 with STM32duinoC# Windows 窗体应用程序 - 未使用 STM32duino 从 nucleo32 L432 接收串行数据
【发布时间】: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


【解决方案1】:

如建议 - 这是解决方案: 我不得不添加serialPort1.DtrEnabled = true 和serialPort1.RtsEnabled = true,因为STM32duino 不做握手。现在它可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多