欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 基于CH32V103的多串口通訊及驗(yàn)證 [打印本頁(yè)]

作者: jinglixixi    時(shí)間: 2020-11-19 21:27
標(biāo)題: 基于CH32V103的多串口通訊及驗(yàn)證
H32V103配置有3個(gè)串口,適用于需要同時(shí)使用多個(gè)串口工作的環(huán)境,例如用在一個(gè)采用串口屏來(lái)顯示工作界面并繪制數(shù)據(jù)波形曲線(xiàn)、一個(gè)串口用來(lái)控制數(shù)據(jù)記錄儀來(lái)存儲(chǔ)原始數(shù)據(jù)、一個(gè)串口來(lái)控制MP3音頻播放模塊來(lái)播報(bào)數(shù)據(jù)或發(fā)出語(yǔ)音提示等。
那么這3個(gè)串行通訊口都使用哪些引腳呢?
其使用的引腳情況如表1所示:

  
串口序號(hào)
  
TX
RX
USART1
A.9
A.10
USART2
A.2
A.3
USART3
B.10
B.11

其中,USART1主要供打印輸出之用,其接口電路如圖1所示。

1 串口1接口電路


那么我們?nèi)绾尾拍茉谑褂闷骷俚那闆r下,來(lái)完成同時(shí)測(cè)試3路串口通信的任務(wù)呢?
這里介紹的方法是,讓2路串口進(jìn)行收發(fā)通信,讓另一路串口來(lái)輸出信息。
具體的任務(wù)分配是:
USART1執(zhí)行老本行,來(lái)完成信息輸出的工作;而將USART2USART3組成一個(gè)模擬雙方收發(fā)數(shù)據(jù)的終端。
那完成這一任務(wù)都需要哪些器件呢?
一條杜邦線(xiàn),一個(gè)USB轉(zhuǎn)TTL通信串口模塊及導(dǎo)線(xiàn),具體的連接形式如圖2所示。
杜邦線(xiàn)的作用是將USART2TX連接到USART3RX,這樣就用一條杜邦線(xiàn)連接起了模擬通信的收發(fā)雙發(fā)。
USB轉(zhuǎn)TTL通信串口模塊大的作用,則是將USART1的輸出信息傳輸?shù)诫娔X,并通過(guò)串口助手等工具軟件來(lái)顯示信息。
當(dāng)然了,如果你要想令USART2USART3的地位平等,那也很容易,無(wú)非是再添加一條杜邦線(xiàn),將空置的2個(gè)通訊引腳連接起來(lái)便是了!

2 多串口通信線(xiàn)路連接

那在程序設(shè)計(jì)上該如何設(shè)計(jì)呢?
為了便于測(cè)試,這里將待發(fā)送的信息存入數(shù)組中:
u8 TxBuffer[] = "Buffer Send fromUSART2 to USART3 by polling!";
然后通過(guò)USARTx_CFG函數(shù)對(duì)USART2USART3進(jìn)行初始化,其內(nèi)容如下:
  1. void USARTx_CFG(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. USART_InitTypeDef USART_InitStructure;
  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_USART3, ENABLE);     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB , ENABLE);
  6. /* USART2 TX-->A.2   RX-->A.3 */
  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  10. GPIO_Init(GPIOA, &GPIO_InitStructure);
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  13. GPIO_Init(GPIOA, &GPIO_InitStructure);
  14. /* USART3 TX-->B.10  RX-->B.11 */
  15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  16. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  18. GPIO_Init(GPIOB, &GPIO_InitStructure);
  19. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  20. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  21. GPIO_Init(GPIOB, &GPIO_InitStructure);   
  22. USART_InitStructure.USART_BaudRate = 115200;
  23. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  24. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  25. USART_InitStructure.USART_Parity = USART_Parity_No;
  26. USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  27. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  28. USART_Init(USART2, &USART_InitStructure);
  29. USART_Cmd(USART2, ENABLE);
  30. USART_Init(USART3, &USART_InitStructure);
  31. USART_Cmd(USART3, ENABLE);
  32. }
復(fù)制代碼

實(shí)現(xiàn)多串口通信測(cè)試的主程序如下:
  1. int main(void)
  2. {
  3. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  4. Delay_Init();
  5. USART_Printf_Init(115200);
  6. printf("SystemClk:%d\r\n",SystemCoreClock);
  7. printf("USART Polling TEST\r\n");
  8. USARTx_CFG();
  9. while(TxCnt<TxSize)
  10. {
  11. USART_SendData(USART2, TxBuffer[TxCnt++]);
  12. while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
  13. while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
  14. RxBuffer[RxCnt++] = (USART_ReceiveData(USART3));
  15. }
  16. TransferStatus=Buffercmp(TxBuffer,RxBuffer,TxSize);
  17. if(TransferStatus)
  18. {
  19. printf("send success!\r\n");
  20. printf("TXBuffer: %s \r\n",TxBuffer);
  21. printf("RxBuffer: %s \r\n",RxBuffer);
  22. }
  23. else
  24. {
  25. printf("send fail!\r\n");
  26. printf("TXBuffer: %s \r\n",TxBuffer);
  27. printf("RxBuffer: %s \r\n",RxBuffer);
  28. }
  29. while(1);
  30. }
復(fù)制代碼

其中關(guān)鍵的程序段是:
while(TxCnt<TxSize)
{
    USART_SendData(USART2,TxBuffer[TxCnt++]);
    while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
    RxBuffer[RxCnt++] = (USART_ReceiveData(USART3));
}
它通過(guò)定義循環(huán)的次數(shù),由USART2把信息發(fā)送出去,而與此同時(shí)又通過(guò)USART3將信息接收回來(lái),最終由。
USART1把接收的信息原樣顯示出來(lái)以供比對(duì)判別。
經(jīng)編譯下載后,其運(yùn)行效果如圖3所示,說(shuō)明多串口通信是正確的。
若感興趣的話(huà),在此基礎(chǔ)上可以拓展出許多有應(yīng)用價(jià)值的功能。


3 多串口通信測(cè)試

作者: 長(zhǎng)風(fēng)007    時(shí)間: 2020-11-26 09:45
很詳細(xì)的,可以做到分時(shí)選通。




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1