极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15828|回复: 14

菜鸟求助:串口通讯

[复制链接]
发表于 2015-9-1 22:41:20 | 显示全部楼层 |阅读模式
我想通过串口发送不同字符到arduino主机,arduino主机通过识别不同的字符打开或关闭相应的PIN脚,一次发送一个字符的我会搞,一次发送若干字符的不会,请教各位老师,谢谢!!
例如:
发送:ABCD0100010001111010001到arduino主机
arduino主机的工作情况是:
接收到A时PIN8为高,延时1秒,然后继续接收到B时PIN8为低,延时一秒,
继续接收到C时PIN9为高,延时1秒,然后继续接收到D时PIN9为低,延时一秒,
继续接收到0时PIN10为高,延时2秒后变低
继续接收到1时PIN11为高,延时2秒后变低
回复

使用道具 举报

发表于 2015-9-2 02:17:28 | 显示全部楼层
那后面那个0啊1啊的想怎么处理呢?
简单思路是用一个数组,把每个接收到的都放到数组里,然后一起处理。需要自己定一个简单的通信协议,程序方面也要复杂一些。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-2 07:58:45 | 显示全部楼层
简单来讲就是上位机发送一段字符串,下位机把字符串拆分成单个的字符进行识别,然后执行相应的PIN脚输出
回复 支持 反对

使用道具 举报

发表于 2015-9-2 09:38:30 | 显示全部楼层
你上位机一个一个的发,arduino一个一个的处理就可以满足你的需求。就算上位机发100个字符,arduino读取也要一个一个的串行读和处理。
回复 支持 反对

使用道具 举报

发表于 2015-9-2 15:19:24 | 显示全部楼层
如果要發送的資料不會太長, 應該不是大問題.  但如果是連續發送的資料, 有可能因為處理時間太長而出現緩存爆滿.

以你的例子, 一個字符, 最少也要延时1秒, 遇上 0/1 就要 2 秒.
但以串口的傳送速度, 就是 9600bps, 一秒已經可以傳送 1200 個 byte, 你的處理速度相差太大了.  要看看你發送資料的頻率及每筆資料的長度, 否則需要自行增加緩存 甚至其他儲存裝置.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-2 19:55:39 | 显示全部楼层
Super169 发表于 2015-9-2 15:19
如果要發送的資料不會太長, 應該不是大問題.  但如果是連續發送的資料, 有可能因為處理時間太長而出現緩存爆 ...

老师你好!我现在发送的数据可能上万个0或1字符,实际上是一个打孔机的坐标,a是x轴电机正转b是x轴电机反转,c   d是y轴电机  0  1是控制两个打孔钻头是否工作的信号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-2 20:00:08 | 显示全部楼层
zhb1190 发表于 2015-9-2 09:38
你上位机一个一个的发,arduino一个一个的处理就可以满足你的需求。就算上位机发100个字符,arduino读取也要 ...

老师你好!这样的话需要上位机把我的文本数据分成一个字符一个字符的发送,如果考虑通信干扰,计算机运行状况的话,可能出现下位机延迟接收等等一系列的问题,下位机工作出现严重定位错误
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-2 20:06:36 | 显示全部楼层
本帖最后由 xhb10 于 2015-9-2 20:07 编辑

精度的控制是通过与步进电机同步的步进光栅计数来实现,比如我要求输入精度为50,步进光栅计数50而且接收到的字符=0  则pin10为高,延时2秒后变低,如果接收到的字符=1  则PIN11为高,延时2秒后变低   然后计数重新计数,50一循环

如果哪位老师帮我解决这个问题,你来攀枝花,我请你吃大餐,谢谢
回复 支持 反对

使用道具 举报

发表于 2015-9-2 21:08:15 | 显示全部楼层
一开始还不把问题写明了,看来,你遇到的问题还不仅仅是串口通信这个问题吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-2 21:15:20 | 显示全部楼层
本帖最后由 xhb10 于 2015-9-2 21:18 编辑

其他已经搞定,现在只是字符串的问题,单个字符已解决能正常工作了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-2 21:57:09 | 显示全部楼层
本帖最后由 xhb10 于 2015-9-2 23:04 编辑

int ledPin1 = 10;
int ledPin2 = 11;
int val;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = Serial.read();
{
    if ('0' == val) {
      digitalWrite(ledPin1, HIGH);
      delay(1000);
      digitalWrite(ledPin1, LOW);
      delay(1000);
    }
    if ('1' == val) {
      digitalWrite(ledPin2, HIGH);
      delay(1000);
      digitalWrite(ledPin2, LOW);
      delay(1000);
    }
  }
}


zb1190老师倒是提醒了我,现在基本能够实现了,不知道发送大量数据代码的时候会怎么样?会不会跟arduino主机串口缓存有关
回复 支持 反对

使用道具 举报

发表于 2015-9-3 01:06:20 | 显示全部楼层
xhb10 发表于 2015-9-2 19:55
老师你好!我现在发送的数据可能上万个0或1字符,实际上是一个打孔机的坐标,a是x轴电机正转b是x轴电机反 ...

要處理上萬的 0 或 1, 你的程式肯定會出問題了.  arduino 串口的 buffer 預設只是 64 byte, 要改成 10K 有點不可能.  以你的處理速度, 絕不適合直接用串口發送處理.
如果要發送的是預先準備好的資料, 建議先放到 SD 卡上, 再由 SD 卡讀出來 (就像歌曲播放一樣).
否則, 建議加入儲存記憶體, 先把串口的資料接收並放進去, 然後再處理.
你現在的程式, 除非發送的一方也是一秒發一個, 否則, 就會失掉大部份資料.
回复 支持 反对

使用道具 举报

发表于 2015-9-3 08:14:32 | 显示全部楼层
串口例程里面多只是单个字符的示例,为什么没有一连串的,哪怕是两个?因为接收一个处理一个这样的模式比较通用,只要多了,问题就不那么简单了,关键是也就不通用了。比如你现在这个问题,要发送上W个,单片机接收完理解完,还要去做外部控制,中间还有延时,这个实现起来就真的跟一个一个处理不是一个难度的。
回复 支持 反对

使用道具 举报

发表于 2015-9-3 18:05:05 | 显示全部楼层
xhb10 发表于 2015-9-2 20:00
老师你好!这样的话需要上位机把我的文本数据分成一个字符一个字符的发送,如果考虑通信干扰,计算机运行 ...

这样呀,那你需要定义一个简单的协议了。arduino侧需要定义一个数组,也是一个一个的读,然后根据你的协议解析出来具体的内容,然后再处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-5 16:39:56 | 显示全部楼层
哪位老师给个例子呗,比如一次传送100个01字符的。下位机收到这一百个字符处理完全后再接收一百个继续,但要注意我有四个状态需要保持,就是x和y轴电机的运动状态,以及x和y步进光栅计数器,当然中间还要加入暂停控制信号,不然机器工作起来岂不是没完没了,如果有人能搞可以联系我qq:283857179,愿意提供有偿支持
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 04:26 , Processed in 0.045518 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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