问题描述
我正在使用STM32F103在UART线上将SD卡上保存的CSV文件传输到ESP8266,文件读取和UART传输代码段如下。 While loop of the STM32f103 for read/transmit file.
使用ESP8266代码上的软件串行代码,我可以从STM32F103读取传输的字符串,传输的字符串的实际长度为59,但是我在串行监视器上得到以下输出 ESP8266 serial monitor output
软件代码如下
#include <SoftwareSerial.h>
#include <Arduino.h>
#include <stdio.h>
#include <string.h>
using namespace std;
SoftwareSerial s; //RX TX
String str= "";
String str_tx = "";
char char_array[60];
double buff[24];
int str_len = 0;
double val;
char* token;
//char* rest = char_array;
int i=0;
void setup() {
// put your setup code here,to run once:
Serial.begin(115200);
s.begin(115200,SWSERIAL_8N1,13,15,false,128); //115200,512
pinMode(13,INPUT);
pinMode(15,OUTPUT);
Serial.println("in setup 1");
Serial.println("in setup 2");
Serial.println("in setup 3");
}
void loop() {
// put your main code here,to run repeatedly:2
while(s.available() >0)
{
char ch=s.read();
if(ch != '\n')
str.concat(ch);
if( ch =='\n' )
{
/*Serial.println("------------------------------------");
Serial.println(char_array);
Serial.println("------------------------------------");*/
Serial.println(str);
str_len = str.length();
Serial.println(str_len);
str.tochararray(char_array,str_len);
Serial.println(char_array);
//strcpy(char_array,str.c_str());
memset(char_array,sizeof(char_array));
str="";
//break;
}
/*
str = s.readStringUntil('\n');
Serial.println(str);
str_len = str.length();
Serial.println(str_len);
//Serial.println(str.c_str());
//strcpy(char_array,str.c_str());
//str.tochararray(char_array,str_len);
//Serial.println(char_array);*/
}
}
我已使用上面的代码进行读取,但是第一个字符串的长度显示不同,长度大约为125,因为第一次将其复制到char缓冲区中,但进一步显示为空。
如果有人能对造成此问题的原因及其解决方法有所了解,谢谢!
解决方法
软件串行在ESP8266上无法很好地工作。使用较低的比特率。这可能会有所帮助,但不能完全解决问题。使用GSM模块时,我遇到了同样的问题。
我使用硬件串行(串行插针1、3)进行通信,并使用软件串行打印调试信息。这使工作变得非常困难。因为该端口用于编程;您需要添加470R电阻以防止损坏模块。每次更改代码时,都需要连接编程器,对模块进行编程,然后需要移除编程器,以便开发板可以与STM32通信。但是使用硬件序列非常稳定,可以解决我的问题。