amobbs.com 阿莫电子技术论坛

标题: 用stc15w和旧光驱移植arduino写字机GRBL之四:FIFO算法 [打印本页]

作者: XTXB    时间: 2018-11-24 11:26
标题: 用stc15w和旧光驱移植arduino写字机GRBL之四:FIFO算法
本帖最后由 XTXB 于 2018-11-25 09:39 编辑

用stc15w4k32s4和旧光驱移植arduino写字机GRBL连载:
[attach]439396[/attach]
用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为协调匹配各个部分数据传递及处理速度的差异,用了三个环形队列:
[attach]439280[/attach]
FIFO算法实现过程图解:
[attach]439295[/attach]
下面在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. //
复制代码



作者: HJJ2008    时间: 2018-11-24 11:31
顶一下楼主
作者: honami520    时间: 2018-11-24 15:01
几年前做3D打印机的时候,要是有你这资料,我就能少花一点时间了。
作者: jerry840922    时间: 2018-11-24 15:42
好帖子,抽空好好学习一下
作者: XTXB    时间: 2018-11-24 16:01
本帖最后由 XTXB 于 2018-11-24 20:30 编辑
honami520 发表于 2018-11-24 15:01
几年前做3D打印机的时候,要是有你这资料,我就能少花一点时间了。


多谢大侠光临!本人当爱好者多年,天生愚笨,到现在还是小白一枚,这些都是结合众网友的资料,写的一点见解,不一定完善,请多指教!
作者: shiva_shiva    时间: 2018-11-24 18:53
往fifo里写数,至少要判一下fifo满不满吧
作者: XTXB    时间: 2018-11-24 19:15
本帖最后由 XTXB 于 2018-11-24 19:22 编辑
shiva_shiva 发表于 2018-11-24 18:53
往fifo里写数,至少要判一下fifo满不满吧


多谢指教!马上改。
作者: fengyunyu    时间: 2018-11-25 16:18
顶一下大牛
作者: 90soso    时间: 2019-3-15 17:16
点个赞,这套代码如果熟悉,可以干很多有意思的东西~~
作者: thyewfty    时间: 2019-12-23 20:50
谢绡分享
作者: mangolu    时间: 2021-1-31 18:56
请教LZ,你上面缓存的那个图片不错,这种样式是用什么来画的?
作者: XTXB    时间: 2021-2-2 21:57
mangolu 发表于 2021-1-31 18:56
请教LZ,你上面缓存的那个图片不错,这种样式是用什么来画的?

办公软件office Publisher
作者: mangolu    时间: 2021-2-3 01:28
XTXB 发表于 2021-2-2 21:57
办公软件office Publisher

哦,谢谢
作者: armok.    时间: 2023-10-25 16:09
帖子移动通知:
原分论坛:8051/STC32【已下线】
目标分论坛:51单片机
移动时间:0小时之后




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4