搜索
bottom↓
回复: 13
打印 上一主题 下一主题

用stc15w和旧光驱移植arduino写字机GRBL之四:FIFO算法

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2018-11-24 11:26:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 XTXB 于 2018-11-25 09:39 编辑

用stc15w4k32s4和旧光驱移植arduino写字机GRBL连载:

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之一:机架搭建
https://www.amobbs.com/thread-5701202-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之二:PCB制作
https://www.amobbs.com/thread-5701573-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之三:Bresenham算法
https://www.amobbs.com/thread-5701994-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之四:FIFO算法

GRBL为协调匹配各个部分数据传递及处理速度的差异,用了三个环形队列:

FIFO算法实现过程图解:

下面在STC上实现FIFO串口发送接收,跟GRBL不同的是,avr是在
USART寄存器空 中断中完成数据的发送,咱这个是在主循环中完成:
  1. //用环形队列通过串口1发送接收数据实验
  2. #include "STC15Fxxxx.H"   //stc15w4k32s4  时钟24M
  3. #define RX_BUFFER_SIZE 128  //接收缓冲尺寸
  4. #define TX_BUFFER_SIZE 64 //发送数据缓存尺寸

  5. u8 xdata rx_buffer[RX_BUFFER_SIZE];//定义一个接收队列
  6. u8 rx_buffer_head = 0;
  7. u8 rx_buffer_tail = 0;

  8. u8 xdata tx_buffer[TX_BUFFER_SIZE];
  9. u8 tx_buffer_head = 0;
  10. u8 tx_buffer_tail = 0;
  11. bit B_TX1_Busy; //发送忙标志

  12. //==========================串口波特率初始化===================
  13. //===========================================================
  14. void Uart1_Init(void)               
  15. {       
  16.         //9600bps@24MHz  9600bps 串口1
  17.         SCON = 0x50;                //8位数据,可变波特率
  18.         AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
  19.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  20.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  21.         TL1 = 0xCC;               
  22.         TH1 = 0xFF;       
  23.         TR1 = 1;                //启动定时器1
  24.         ES = 1;     //串行中断 允许控制位
  25.         REN = 1;    //串口1允许接收       
  26.         EA=1;     //开全局中断
  27. }
  28. //
  29. //========================接收队列有关操作=====================
  30. //===========================================================
  31. //复位队列
  32. void serial_reset_read_buffer(void)
  33. {
  34.         rx_buffer_tail = rx_buffer_head;
  35.         tx_buffer_tail = tx_buffer_head;
  36. }
  37. //入队, 将串口1接收到的数据加入到接收队列rx_buffer[ ]中
  38. void ISR_USART_RX(void)
  39. {
  40.         static u8 next_head=0;                               
  41.         next_head = rx_buffer_head + 1;
  42.         if (next_head == RX_BUFFER_SIZE)  next_head = 0;
  43.                 // Write data to buffer unless it is full.
  44.         if (next_head != rx_buffer_tail)  //如果接收队列未满
  45.         {
  46.                 rx_buffer[rx_buffer_head] = SBUF;
  47.                 rx_buffer_head = next_head;   
  48.         }
  49.         else
  50.         {
  51.                 ;//队列满处理
  52.         }
  53. }
  54. //出队,读接收队列的数据
  55. u8 serial_read(void)
  56. {
  57.         static u8 Temp = 0;
  58.         if (rx_buffer_head == rx_buffer_tail)
  59.         {   //如果是空
  60.                 return 0;
  61.         }else {
  62.                 Temp= rx_buffer[rx_buffer_tail];
  63.                 rx_buffer_tail++;
  64.                 if (rx_buffer_tail == RX_BUFFER_SIZE)  rx_buffer_tail = 0;
  65.                 return Temp;
  66.         }
  67. }
  68. //============================发送队列有关操作=================
  69. //===========================================================
  70. //入队,将需要发送的数据加入到发送队列tx_buffer[]中
  71. void serial_write(u8 Byt)
  72. {
  73.         static u8 next_head;
  74.         next_head = tx_buffer_head + 1;
  75.         if (next_head == TX_BUFFER_SIZE) { next_head = 0; }
  76.         if (next_head !=tx_buffer_tail)  //如果发送队列未满
  77.         {
  78.                 tx_buffer[tx_buffer_head] = Byt;
  79.                 tx_buffer_head = next_head;       
  80.         }
  81.         else
  82.         {
  83.                 ;//队列满处理
  84.         }

  85. }
  86. //出队,将发送队列的数据通过串口发送出去
  87. void Send_tx_buffer(void)  
  88. {
  89.         if (tx_buffer_head != tx_buffer_tail){ //队列如果不是空
  90.                 SBUF= tx_buffer[tx_buffer_tail];
  91.                 tx_buffer_tail++;
  92.                 if (tx_buffer_tail == TX_BUFFER_SIZE)  tx_buffer_tail = 0;
  93.                 B_TX1_Busy = 1;
  94.                 while(B_TX1_Busy);             //等待发送完成
  95.         }       
  96. }
  97. //发送一个字符串
  98. void printString(const char *s)
  99. {
  100.         while (*s)
  101.         serial_write(*s++);
  102. }
  103. //====================== UART1中断函数=========================
  104. //============================================================
  105. void UART1_int (void) interrupt 4
  106. {
  107.          if(RI)//有接收
  108.         {
  109.                 RI = 0;
  110.                 ISR_USART_RX();
  111.         }

  112.          if(TI)//发送完成
  113.         {
  114.                 TI = 0; //清除TI位
  115.                 B_TX1_Busy = 0;//发送缓冲为空
  116.         }
  117. }
  118. //======================主函数 ===========================
  119. //=========================================================
  120. void main(void)
  121. {
  122.         u32 ui_UART_Cnt=0;//延时计数器
  123.         u8 temp;
  124.         P2M1=B0000_0000;     //00上拉准双向口/10浮空输入
  125.         P2M0=B0000_0100;     //11开漏输出/01推挽输出
  126.         Uart1_Init();
  127.         serial_reset_read_buffer();
  128.         printString("stc15w4k32串口环形队列实验\r\n");
  129.         for (;;){
  130.                 ui_UART_Cnt++;                       
  131.                 Send_tx_buffer();//将发送队列tx_buffer[ ]的数据发送出去       
  132.                 if(ui_UART_Cnt>160000){        //延时计数器
  133.                         ui_UART_Cnt=0;                               
  134.                          P22=!P22;  //  "hello world"
  135.                         if(temp=serial_read()){   //读接收队列rx_buffer[ ]的数据,如果不为空
  136.                                 serial_write(temp);  //加入发送队列tx_buffer[ ]中
  137.                         }
  138.                 }                 
  139.         }
  140. }
  141. //
复制代码


本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

2
发表于 2018-11-24 11:31:08 | 只看该作者
顶一下楼主

出0入90汤圆

3
发表于 2018-11-24 15:01:21 | 只看该作者
几年前做3D打印机的时候,要是有你这资料,我就能少花一点时间了。

出0入0汤圆

4
发表于 2018-11-24 15:42:33 | 只看该作者
好帖子,抽空好好学习一下

出0入0汤圆

5
 楼主| 发表于 2018-11-24 16:01:06 | 只看该作者
本帖最后由 XTXB 于 2018-11-24 20:30 编辑
honami520 发表于 2018-11-24 15:01
几年前做3D打印机的时候,要是有你这资料,我就能少花一点时间了。


多谢大侠光临!本人当爱好者多年,天生愚笨,到现在还是小白一枚,这些都是结合众网友的资料,写的一点见解,不一定完善,请多指教!

出0入0汤圆

6
发表于 2018-11-24 18:53:49 | 只看该作者
往fifo里写数,至少要判一下fifo满不满吧

出0入0汤圆

7
 楼主| 发表于 2018-11-24 19:15:20 | 只看该作者
本帖最后由 XTXB 于 2018-11-24 19:22 编辑
shiva_shiva 发表于 2018-11-24 18:53
往fifo里写数,至少要判一下fifo满不满吧


多谢指教!马上改。

出100入101汤圆

8
发表于 2018-11-25 16:18:19 | 只看该作者
顶一下大牛

出0入0汤圆

9
发表于 2019-3-15 17:16:14 | 只看该作者
点个赞,这套代码如果熟悉,可以干很多有意思的东西~~

出0入0汤圆

10
发表于 2019-12-23 20:50:36 | 只看该作者
谢绡分享

出0入0汤圆

11
发表于 2021-1-31 18:56:44 | 只看该作者
请教LZ,你上面缓存的那个图片不错,这种样式是用什么来画的?

出0入0汤圆

12
 楼主| 发表于 2021-2-2 21:57:23 | 只看该作者
mangolu 发表于 2021-1-31 18:56
请教LZ,你上面缓存的那个图片不错,这种样式是用什么来画的?

办公软件office Publisher

出0入0汤圆

13
发表于 2021-2-3 01:28:28 | 只看该作者
XTXB 发表于 2021-2-2 21:57
办公软件office Publisher

哦,谢谢

出16170入6148汤圆

14
发表于 2023-10-25 16:09:17 来自手机 | 只看该作者
帖子移动通知:
原分论坛:8051/STC32【已下线】
目标分论坛:51单片机
移动时间:0小时之后
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 19:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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