迪文屏幕学习笔记四:串口使用和定时器使用

Bertha 。 2023-05-30 10:55 91阅读 0赞

我感觉迪文屏幕分两大类吧,指令屏和OS屏,指令屏幕只能通过UART指令交互和DWIN GUI交互;

OS屏幕,则可以通过在屏幕上二次开发,来实现我们的功能,当然了,OS屏幕也支持UART指令和

DWIN GUI交互,像指令屏那样开发。目前OS支持两到类开发:汇编开发和C语言开发。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70

一、DWIN GUI交互串口2

首先明确下串口电平,这个要看硬件手册,串口2是DWIN GUI的DEBUG口,RS232电平,剩下的口

有的是TTL电平、有的是RS232电平(PS:电平不对,会把串口烧坏),有的屏幕还带RS485,这个

就要看具体的屏幕数据手册(PS:找淘宝客服或者迪文官方QQ要,说句实话服务人员的态度还是不错

的,给他们点赞。但是有的问题他们也不懂,毕竟不是技术人员。顺便吐槽迪文的资料写的太烂、太烂

、太烂,无力吐槽。还有建议迪文开放技术交流渠道,有些问题资料不写,根本解决不了。)

PS:串口2是DWIN GUI的DEBUG口,用户不得使用(也用不了,没有开放接口)。

首先来看波特率:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 1

再看串口交互数据格式:
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 3 CRC16计算(PS:这个也可以通过配置文件关闭)

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 4

通过以上就可以访问DWIN GUI的寄存器和数据,具体的指令地址请看手册。

通过以上,我们就可以和GUI进行交互了。

二、基于OS的串口使用

如果我们要进行二次开发,把一部分功能放到屏幕上,那么我们可以通过其他串口进行私有协议开发。

由于对用的开发有汇编和C,他们有不同的接口,这里仅仅讲解C语言开发。

首先来看支持的波特率:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 5

PS:串口3仅仅不支持9600波特率。

C语言接口:

20191110083606162.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 6

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 7

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 8

使用:

配置串口:com_config(3,0,115200); //串口设置,串口3配置115200波特率,N81格式。

下面来说下UART使用发送和就收架构:

UART的接收流程:

UART接收是按着数据流接收的,它并不知道什么是“完”,由于程序量小,协议不复杂,我才用Timer Out方法,即接收超时概念

来使用串口接收。手册上给了UARTX_TTL_State,0x00表示接收超时,但是我测试了下,不行,我根本查不到0x00这个状态

,此路明显不同,于是我采用了如下方法:

当接收缓存不为空时候,我就隔一段时间去查询现在的接收数据长度,如果本地接收数据长度和上次接收数据长度一致,

则认为接收完成,就去解析数据了,代码如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 9

接收说完了,现在来说发送:

发送之前要先判断串口是否忙,否则有可能造成发上帧送数据帧发送了一部分,导致后面一部分没有发送,或者有retry机制,导致retry时候数据被清掉。基于以上两点原因,我自己做了个很简陋的发送架构如下(PS:UARTX_TX_LEN这个寄存器,我不知道如何使用,因此我就没用):

  1. static void uart_tx_process(void)
  2. {
  3. static enum{
  4. FSM_UART_TX_PROCESS_STATE_START = 0,
  5. FSM_UART_TX_PROCESS_STATE_WAIT_TX,
  6. FSM_UART_TX_PROCESS_STATE_WAIT_ACK,
  7. }s_tState = FSM_UART_TX_PROCESS_STATE_START;
  8. static unsigned char s_chRetrySend = 0;
  9. #define RESET_FSM_UART_TX_PROCESS() {s_tState = FSM_UART_TX_PROCESS_STATE_START;}
  10. switch(s_tState){
  11. case FSM_UART_TX_PROCESS_STATE_START:
  12. s_chRetrySend = 0;
  13. s_tState = FSM_UART_TX_PROCESS_STATE_WAIT_TX;
  14. //break;
  15. case FSM_UART_TX_PROCESS_STATE_WAIT_TX:
  16. if(get_systick()%5){
  17. return;
  18. }
  19. if(!s_hwUartTXCnt){
  20. return;
  21. }
  22. // if(app_read_register(22)){//等待发送缓存区空
  23. // return;
  24. // }
  25. FLAG_ACK_CLEAR();
  26. send_data_com(USER_APP_UART_NUM,s_chUartTxBuffer,s_hwUartTXCnt);
  27. if(UART_GET_WAIT_ACK()){
  28. s_hwUartWaitTimer = 600;
  29. s_tState = FSM_UART_TX_PROCESS_STATE_WAIT_ACK;
  30. }else{
  31. s_hwUartTXCnt = 0;
  32. UART_CLEAR_BUSY();
  33. RESET_FSM_UART_TX_PROCESS();
  34. }
  35. break;
  36. case FSM_UART_TX_PROCESS_STATE_WAIT_ACK:
  37. if(!s_hwUartWaitTimer){
  38. if(s_chRetrySend >= 2){
  39. s_hwUartTXCnt = 0;
  40. UART_CLEAR_BUSY();
  41. //UART_CLEAR_WAIT_ACK();
  42. RESET_FSM_UART_TX_PROCESS();
  43. return;
  44. }else{
  45. s_tState = FSM_UART_TX_PROCESS_STATE_WAIT_TX;
  46. }
  47. s_chRetrySend++;
  48. }
  49. if(FLAG_ACK_GET()){
  50. s_hwUartTXCnt = 0;
  51. UART_CLEAR_BUSY();
  52. //UART_CLEAR_WAIT_ACK();
  53. RESET_FSM_UART_TX_PROCESS();
  54. return;
  55. }
  56. break;
  57. default:
  58. while(1);
  59. }
  60. #undef RESET_FSM_UART_TX_PROCESS
  61. }

每隔5ms看看TXbuffer(这个是用户定义的)是否非空,如果非空,则发送数据;发送后,判定是否等待ACK应道,如果是,则等待ACK,同时查看超时标示(我设置的1.2S),如果1.2S超时标志到了,ACK标志未到,则启动重发机制,重发3次;如果ACK,则本次发送结束;如果不需要等待ACK,则本次发送也结束;清除buffer占用标志。来看用户接口:

  1. static fsm_rt_t app_send_cmd(unsigned char chCMD,unsigned char chIsWaitACK)
  2. {
  3. //unsigned short hwTemp = 0;
  4. if(UART_GET_BUSY()){
  5. return fsm_rt_on_going;
  6. }
  7. s_chUartTxBuffer[0] = 0x68;
  8. s_chUartTxBuffer[1] = 0x00;
  9. s_chUartTxBuffer[2] = 0x00;
  10. s_chUartTxBuffer[3] = 0x01;
  11. s_chUartTxBuffer[4] = 0x00;
  12. s_chUartTxBuffer[5] = chCMD;
  13. switch(chCMD){
  14. case 4:
  15. s_chUartTxBuffer[6] = 0xB8;
  16. s_chUartTxBuffer[7] = 0x66;
  17. break;
  18. case 5:
  19. s_chUartTxBuffer[6] = 0x99;
  20. s_chUartTxBuffer[7] = 0x76;
  21. break;
  22. case 6:
  23. s_chUartTxBuffer[6] = 0xFA;
  24. s_chUartTxBuffer[7] = 0x46;
  25. break;
  26. case 7:
  27. s_chUartTxBuffer[6] = 0xDB;
  28. s_chUartTxBuffer[7] = 0x56;
  29. break;
  30. case 8:
  31. s_chUartTxBuffer[6] = 0x34;
  32. s_chUartTxBuffer[7] = 0xA7;
  33. break;
  34. case 18:
  35. s_chUartTxBuffer[6] = 0x4F;
  36. s_chUartTxBuffer[7] = 0x14;
  37. break;
  38. default:
  39. break;
  40. }
  41. // hwTemp = CRC16_plc(s_chUartTxBuffer+1,5);
  42. // s_chUartTxBuffer[6] = hwTemp >> 8;
  43. // s_chUartTxBuffer[7] = hwTemp;
  44. s_chUartTxBuffer[8] = 0x16;
  45. UART_SET_BUSY();
  46. s_hwUartTXCnt = 9;
  47. UART_SET_WAIT_ACK(chIsWaitACK);
  48. return fsm_rt_cpl;
  49. }

很简单,查看缓存是否可用,然后把数据写到缓存里面,同时置忙标志位。

PS:函数嵌套不能太深,最好不要超过4级,可能会导致意向不到的结果;我开始用的嵌套了6级,导致发送出来的数据全是乱码,通过检查临时变量和函数嵌套深度,解决。

三、TIMER使用

来看C接口:

20191110092843461.png

这个接口是数据手册给的,是错误的,不要使用,用下面的接口:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 10

寄存器号:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1aGVueW91eXV5b3V5dQ_size_16_color_FFFFFF_t_70 11

20191110093234707.png

使用:

20191110093416923.png

20191110093424247.png

发表评论

表情:
评论列表 (有 0 条评论,91人围观)

还没有评论,来说两句吧...

相关阅读