电子产业一站式赋能平台

PCB联盟网

搜索
查看: 3013|回复: 6
收起左侧

求救啊 arduino 串口读写问题

[复制链接]

585

主题

910

帖子

4977

积分

四级会员

Rank: 4

积分
4977
发表于 2023-4-23 10:55:33 | 显示全部楼层 |阅读模式
最近想拿arduino和xbox手柄写一个航模的遥控器
初期很顺利地利用unity写好了桌面端,然后写了一个Arduino,就是把串口里传来的字符串英文中间夹杂的数字取出来转换成整数然后再用舵机writemicrowsecond输出为pwm信号,就这么简单一个程序,却怎么也完不成了
先是买来的si4438模块由于电脑端写入量太大直接死机,我在电脑端修改了发送串口数据的频率,然后Arduino端用readBytesUntil函数读写,却发现这个函数总是读不完便停止了读写,导致后边的验证完整性的函数验证不过去,数据丢失率达到了95%,也就是说电脑端发送100条数据,Arduino端有95条是读错的,读错是因为读成了两端段,这个字符串长度是26,为了让这个函数不提前结束,我还特意加大了读取的范围,结果还是不行,后来我减小了电脑端输出数据的频率,由0.2秒改为1秒,结果这个函数还是都不完整,求大神来帮帮我
回复

使用道具 举报

10

主题

904

帖子

812

积分

二级会员

Rank: 2

积分
812
发表于 2023-4-23 10:56:31 | 显示全部楼层
#include<Wire.h>
#include<Servo.h>
#include<SoftwareSerial.h>


#define T 2
#define R 3
#define P 4
#define Y 5


#define A1 6
#define A2 7
#define A3 10
#define A4 11




#define cx 15
#define cy 16


#define RX 8
#define TX 9


Servo tservo;//throttle
Servo rservo;//roll
Servo pservo;//pitch
Servo yservo;//yaw


Servo a1servo;//aux1
Servo a2servo;//aux2
Servo a3servo;//aux3
Servo a4servo;//au4


Servo cxservo;//camerax
Servo cyservo;//cameray


SoftwareSerial sserial(8, 9);


char infostore[26] = {0};


void setup() {
  // put your setup code here, to run once:
  pinMode(T, OUTPUT); //T
  pinMode(R, OUTPUT); //R
  pinMode(P, OUTPUT); //P
  pinMode(Y, OUTPUT); //Y
  pinMode(A1, OUTPUT); //A1
  pinMode(A2, OUTPUT); //A2
  pinMode(A3, OUTPUT); //A3
  pinMode(A4, OUTPUT); //A4
  pinMode(cx, OUTPUT); //X
  pinMode(cy, OUTPUT); //Y


  tservo.attach(T);
  rservo.attach(R);
  pservo.attach(P);
  yservo.attach(Y);


  a1servo.attach(A1);
  a2servo.attach(A2);
  a3servo.attach(A3);
  a4servo.attach(A4);


  Serial.begin(9600);


  sserial.begin(9600);
}


void loop() {
  // put your main code here, to run repeatedly:
  char readbuffer[64];
  char checkbuffer;
  while(Serial.available()!=true)
  {
    ;
  }
  delay(5);
  //sserial.println("ready");
  checkbuffer = Serial.read();
  for (; checkbuffer != '#';)
  {
    checkbuffer = Serial.read();
  }


  Serial.println("get");
  Serial.readBytesUntil('#', readbuffer, 64);
  readbuffer[63] = 0;
  Serial.println(readbuffer);
  if (readbuffer[24] == 'E')
  {
    Serial.println("ture");
    for (int i = 0; i <= 25; i++)
    {
      infostore = readbuffer;
    }
    memset( readbuffer, 0, sizeof(readbuffer) );
    while (Serial.read() >= 0) {};
    putout();
    delay(2);
  }
}
void putout()
{
  char tpwm[4];
  char rpwm[4];
  char ppwm[4];
  char ypwm[4];
  char a1info;
  char a2info;
  char a3info;
  char a4info;
  char Xinfo;
  char Yinfo;
  int ti, ri, pi, yi;
  int t, r, p, y;
  int a1, a2, a3, a4;


  tpwm[0] = infostore[1];
  tpwm[1] = infostore[2];
  tpwm[2] = infostore[3];
  tpwm[3] = 0;
  //Serial.println(tpwm);


  rpwm[0] = infostore[5];
  rpwm[1] = infostore[6];
  rpwm[2] = infostore[7];
  rpwm[3] = 0;
  //Serial.println(rpwm);


  ppwm[0] = infostore[9];
  ppwm[1] = infostore[10];
  ppwm[2] = infostore[11];
  ppwm[3] = 0;
  //Serial.println(ppwm);


  ypwm[0] = infostore[13];
  ypwm[1] = infostore[14];
  ypwm[2] = infostore[15];
  ypwm[3] = 0;
  //Serial.println(ypwm);


  a1info = infostore[17];
  a2info = infostore[18];
  a3info = infostore[19];
  a4info = infostore[20];






  ti = ctoi(tpwm);
  ri = ctoi(rpwm);
  pi = ctoi(ppwm);
  yi = ctoi(ypwm);






  t = ti * 10;
  r = ri * 10;
  p = pi * 10;
  y = yi * 10;


//  sserial.println(t);
//  sserial.println(r);
//  sserial.println(p);
//  sserial.println(y);
//  Serial.println(t);
//  Serial.println(r);
//  Serial.println(p);
//  Serial.println(y);


  a1 = 0;
  a2 = 0;
  a3 = 0;
  a4 = 0;
  tservo.writeMicroseconds(t);
  rservo.writeMicroseconds(r);
  pservo.writeMicroseconds(p);
  yservo.writeMicroseconds(y);


  a1servo.writeMicroseconds(a1);
  a2servo.writeMicroseconds(a2);
  a3servo.writeMicroseconds(a3);
  a4servo.writeMicroseconds(a4);
  delay(3);
}




int ctoi(char a[3])
{
  if (a[0] != '0' || a[1] != '0' || a[2] != '0')
  {
    int b, c, d, e;
    b = ((int)a[0]) - 48;
    c = ((int)a[1]) - 48;
    d = ((int)a[2]) - 48;
    e = (b * 100) + (c * 10) + (d);
    //Serial.println(e);
    return e;
  }
  else {
    return 0;
  }
}
回复 支持 反对

使用道具 举报

2851

主题

4614

帖子

2万

积分

官网认证

Rank: 3Rank: 3

积分
25793

活跃会员热心会员推广达人优秀版主

发表于 2023-4-23 10:56:40 | 显示全部楼层
楼上是程序源码,运行起来用串口监视器显示读出来的有很多是不完整的
然后会在下一次读出来
我飞机其他配件都到了,就这个一直弄不好,急死了
回复 支持 反对

使用道具 举报

0

主题

829

帖子

622

积分

二级会员

Rank: 2

积分
622
发表于 2023-4-23 10:56:46 | 显示全部楼层
之所以又写个ctoi是因为官方的总是调用不成功我自己又写了个适合自己的
回复 支持 反对

使用道具 举报

633

主题

1927

帖子

8108

积分

联盟顾问

Rank: 3Rank: 3

积分
8108
发表于 2023-4-23 10:57:42 | 显示全部楼层
哇没人么
回复 支持 反对

使用道具 举报

0

主题

875

帖子

675

积分

二级会员

Rank: 2

积分
675
发表于 2023-4-23 10:58:26 | 显示全部楼层
波特率
回复 支持 反对

使用道具 举报

0

主题

804

帖子

517

积分

二级会员

Rank: 2

积分
517
发表于 2023-4-23 10:58:37 | 显示全部楼层
直接两个普通10口和两个pwm口做接收口不就行了。
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表