小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
123
返回列表 发新帖
楼主: jackzeng

arduino下位机通信协议(完全兼容论坛的上位机程序)

[复制链接]
发表于 2013-6-30 18:54:21 | 显示全部楼层
还有一种方法:
用一个max232加上四个104的瓷片电容,做成串口通讯转换,将max232的7和8脚短接(短路,,,连在一起)7脚和8脚是连接pc的串口2脚和3脚。

这个淘宝上有:地址http://item.taobao.com/item.htm? ... &_u=ujtnj66ee50
回复 支持 反对

使用道具 举报

发表于 2013-7-14 07:06:19 | 显示全部楼层
上个图,这是max232的原理和引脚图,我自己用max232和几个105焊接了一个板子,目前还没连接成功
我用的是db120和arduino uno 小车都做好了,摄像头也调通了,剩下的就是搞定电机驱动板和下位机了
a8ec8a13632762d07468351ca0ec08fa503d269759eee603.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-22 22:30:28 | 显示全部楼层
好久没有来逛论坛了,发现有人对我的程序有疑问,特此添加一些注释。
int n = 1;
int flagCount = 0;  '接收到数据包FF的数量,如果数值等于0表示接收到数据包头,等于2表示接收到数据包尾
int tempData = 0; ' 存放读取到的缓冲区的第一个字节
int UARTReveived = 0; 接收到数据包的结尾,也就是第二个FF的时候该变量的值为1,这时表示数据包已经接收完整,准备执行命令;执行完后该值变为0
int rxData[5];
void loop()
{
  if(Serial.available())
  {
    tempData = Serial.read();
    delay(3);
    if(tempData == UART_FLAG && flagCount < 2) ' flagCount < 2成立时有两种情况:flagCount == 0或者 flagCount == 1。等于0时表示之前没有接收过FF,这次接收到的FF是数据包的开头。等于1则表示之前已经接受过一次FF,这次接收到的第二个FF是数据包的结尾。假如发送的是“FF000100FF”,那第一次检测到FF(也就是tempData == UART_FLAG )时flagCount == 0 ,所以条件为真,执行大括号的内容。注意一个字节是十六进制的0xFF,而不是F!    {
      rxData[0] = tempData; '把接收到的FF存放到数组 rxData的第一位。这里其实有一点逻辑错误!!当接收到数据包的结尾,也就是flagCount == 1 时,也会往数组的第一位写进FF,但这完全不会影响到程序的执行。
      flagCount++; ' 每接收到第一个FF,这个值就会加1。
    }
    else ' 如果上述条件不成立则表示正在接收数据包中
    {
      rxData[n] = tempData;
      n++;
    }
    if(flagCount == 2) '当接收到第二个FF时,这个条件就会成立,表示数据包接收完毕
    {
      rxData[4] == UART_FLAG;
      UARTReveived = 1;
      n = 1;
      flagCount = 0;
      tempData = 0;
      Serial.flush();
    }
  }
  if(UARTReveived == 1)
  {
    if(rxData[1] == MOTO)
    {
       switch(rxData[2])
       {
         case FORWARD:
         carGoFwd();
         break;
         case BACKWARD:
         carGoBwd();
         break;
         case TURNLEFT:
         carTurnL();
         break;
         case TURNRIGHT:
         carTurnR();
         break;
         case CARSTOP:
         carStop();
         break;
       }
       UARTReveived = 0;
    }
    else if(rxData[1] == SERVO)
    {
      servoSet(rxData[2], rxData[3]);
      UARTReveived = 0;
    }
    else if(rxData[1] == MOTOSPEED)
    {
      CHNSpeed(rxData[2], rxData[3]);
      UARTReveived = 0;
    }
  }
}
回复 支持 反对

使用道具 举报

发表于 2013-8-31 21:23:48 | 显示全部楼层
serial.read()每次只能读取一个字节也就是一个字符,如果用UNO的IDE进行调试,发送“FF00", rxdata[0]=F,rxdata[1]=F,rxdata[2]=0,rxdata[3]=0,这样就无法接受命令,为什么楼主说是16进制的FF放在rxdata[0]中呢?
回复 支持 反对

使用道具 举报

发表于 2013-9-1 09:42:12 | 显示全部楼层
boyboysk 发表于 2013-8-31 21:23
serial.read()每次只能读取一个字节也就是一个字符,如果用UNO的IDE进行调试,发送“FF00", rxdata[0]=F,r ...


兄弟读帖不仔细哦,注意看你楼上的帖子有这句话“注意一个字节是十六进制的0xFF
我当初也是和你一样纠结于同样的问题,读了楼主的解释后,豁然开朗
回复 支持 反对

使用道具 举报

发表于 2013-9-12 14:44:19 | 显示全部楼层
注意一个字节是十六进制的0xFF
回复 支持 反对

使用道具 举报

发表于 2013-9-12 19:59:29 | 显示全部楼层
谢谢,非常实用
回复 支持 反对

使用道具 举报

发表于 2015-10-24 10:42:24 | 显示全部楼层
正想看看通讯协议那一块  楼主这个很不错
回复 支持 反对

使用道具 举报

发表于 2015-10-25 18:28:01 | 显示全部楼层
楼主很棒 终于搞通这个协议了  但是舵机的那部分有一点问题 好像完全没起作用 (串口是可以打印出角度的)
回复 支持 反对

使用道具 举报

发表于 2017-7-17 16:08:43 | 显示全部楼层
你好 请问这个程序匹配的是哪个上位机啊 是带方向盘的那个还是只有上下左右的那个啊
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-22 23:45 , Processed in 1.117236 second(s), 19 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表