菜鸟求助:串口通讯
我想通过串口发送不同字符到arduino主机,arduino主机通过识别不同的字符打开或关闭相应的PIN脚,一次发送一个字符的我会搞,一次发送若干字符的不会,请教各位老师,谢谢!!例如:
发送:ABCD0100010001111010001到arduino主机
arduino主机的工作情况是:
接收到A时PIN8为高,延时1秒,然后继续接收到B时PIN8为低,延时一秒,
继续接收到C时PIN9为高,延时1秒,然后继续接收到D时PIN9为低,延时一秒,
继续接收到0时PIN10为高,延时2秒后变低
继续接收到1时PIN11为高,延时2秒后变低 那后面那个0啊1啊的想怎么处理呢?
简单思路是用一个数组,把每个接收到的都放到数组里,然后一起处理。需要自己定一个简单的通信协议,程序方面也要复杂一些。 简单来讲就是上位机发送一段字符串,下位机把字符串拆分成单个的字符进行识别,然后执行相应的PIN脚输出
你上位机一个一个的发,arduino一个一个的处理就可以满足你的需求。就算上位机发100个字符,arduino读取也要一个一个的串行读和处理。 如果要發送的資料不會太長, 應該不是大問題.但如果是連續發送的資料, 有可能因為處理時間太長而出現緩存爆滿.
以你的例子, 一個字符, 最少也要延时1秒, 遇上 0/1 就要 2 秒.
但以串口的傳送速度, 就是 9600bps, 一秒已經可以傳送 1200 個 byte, 你的處理速度相差太大了.要看看你發送資料的頻率及每筆資料的長度, 否則需要自行增加緩存 甚至其他儲存裝置.
Super169 发表于 2015-9-2 15:19 static/image/common/back.gif
如果要發送的資料不會太長, 應該不是大問題.但如果是連續發送的資料, 有可能因為處理時間太長而出現緩存爆 ...
老师你好!我现在发送的数据可能上万个0或1字符,实际上是一个打孔机的坐标,a是x轴电机正转b是x轴电机反转,c d是y轴电机01是控制两个打孔钻头是否工作的信号 zhb1190 发表于 2015-9-2 09:38 static/image/common/back.gif
你上位机一个一个的发,arduino一个一个的处理就可以满足你的需求。就算上位机发100个字符,arduino读取也要 ...
老师你好!这样的话需要上位机把我的文本数据分成一个字符一个字符的发送,如果考虑通信干扰,计算机运行状况的话,可能出现下位机延迟接收等等一系列的问题,下位机工作出现严重定位错误 本帖最后由 xhb10 于 2015-9-2 20:07 编辑
精度的控制是通过与步进电机同步的步进光栅计数来实现,比如我要求输入精度为50,步进光栅计数50而且接收到的字符=0则pin10为高,延时2秒后变低,如果接收到的字符=1则PIN11为高,延时2秒后变低 然后计数重新计数,50一循环
如果哪位老师帮我解决这个问题,你来攀枝花,我请你吃大餐,谢谢:D:D:D:D:D 一开始还不把问题写明了,看来,你遇到的问题还不仅仅是串口通信这个问题吧 本帖最后由 xhb10 于 2015-9-2 21:18 编辑
其他已经搞定,现在只是字符串的问题,单个字符已解决能正常工作了
本帖最后由 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主机串口缓存有关 xhb10 发表于 2015-9-2 19:55 static/image/common/back.gif
老师你好!我现在发送的数据可能上万个0或1字符,实际上是一个打孔机的坐标,a是x轴电机正转b是x轴电机反 ...
要處理上萬的 0 或 1, 你的程式肯定會出問題了.arduino 串口的 buffer 預設只是 64 byte, 要改成 10K 有點不可能.以你的處理速度, 絕不適合直接用串口發送處理.
如果要發送的是預先準備好的資料, 建議先放到 SD 卡上, 再由 SD 卡讀出來 (就像歌曲播放一樣).
否則, 建議加入儲存記憶體, 先把串口的資料接收並放進去, 然後再處理.
你現在的程式, 除非發送的一方也是一秒發一個, 否則, 就會失掉大部份資料. 串口例程里面多只是单个字符的示例,为什么没有一连串的,哪怕是两个?因为接收一个处理一个这样的模式比较通用,只要多了,问题就不那么简单了,关键是也就不通用了。比如你现在这个问题,要发送上W个,单片机接收完理解完,还要去做外部控制,中间还有延时,这个实现起来就真的跟一个一个处理不是一个难度的。 xhb10 发表于 2015-9-2 20:00 static/image/common/back.gif
老师你好!这样的话需要上位机把我的文本数据分成一个字符一个字符的发送,如果考虑通信干扰,计算机运行 ...
这样呀,那你需要定义一个简单的协议了。arduino侧需要定义一个数组,也是一个一个的读,然后根据你的协议解析出来具体的内容,然后再处理。 哪位老师给个例子呗,比如一次传送100个01字符的。下位机收到这一百个字符处理完全后再接收一百个继续,但要注意我有四个状态需要保持,就是x和y轴电机的运动状态,以及x和y步进光栅计数器,当然中间还要加入暂停控制信号,不然机器工作起来岂不是没完没了,如果有人能搞可以联系我qq:283857179,愿意提供有偿支持
页:
[1]