打印

技术探讨:看下这个是怎样实现16位双字节数字通过串口发...

[复制链接]
1413|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
     如题,,我的数据都是双字节的数据的,而串口发送每次都是8位的单字节发送的,,请看下面的程序的:

   u16 vibra_send[35]={0x5442,1,0,0,0,0};  
发送数据的时候就这样做的,但是不知道什么意思的。。。
   USART1_Send((u8*)vibra_send,70);
沙发
firstblood|  楼主 | 2015-10-7 18:16 | 只看该作者
查找了相关的send函数的。。。
void USART1_Send(u8 *buff,s16 len)
{
        //USART_Cmd(USART1, ENABLE);
        pUSART1_TxBuff=buff;
        USART1_TxCount=len;       
        USART1_SendSta=USART_SENDSTA_RUN;
        //USART_ClearITPendingBit(USART1,USART_IT_TXE);
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
        while(USART1_SendSta==USART_SENDSTA_RUN);
        //        PWR_EnterSLEEPMode(0,PWR_SLEEPEntry_WFI);           //
        USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   /* Disable the USART1 Transmit interrupt */
        //USART_Cmd(USART1, DISABLE);       
}

使用特权

评论回复
板凳
firstblood|  楼主 | 2015-10-7 18:18 | 只看该作者
然后又看了下pUSART1_TxBuff的定义的,,,
static u8 *pUSART1_TxBuff;
其他方面的涉及到的也给贴出来的,中断程序中 :
void USART1_IRQHandler(void)
{
  static vu8 tmp;

  if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
  {       
                if(USART1_RecvSta!=USART_RECVSTA_RUN)
                {
                        tmp=USART_ReceiveData(USART1);
                        return;
                }
    if(USART1_RxCount>0)
                {
            *pUSART1_RxBuff++ = USART_ReceiveData(USART1);
                        USART1_RxCount--;                       
                }
                  if(USART1_RxCount<=0)
            {                              /* Disable the USART1 Receive interrupt */
               USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
                                 USART1_RecvSta=USART_RECVSTA_SUCC;
                                //USART_Cmd(USART1, DISABLE);
            }
        }
  if((USART1_SendSta==USART_SENDSTA_RUN)&&(USART_GetITStatus(USART1, USART_IT_TXE) != RESET))//if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {
    if(USART1_TxCount>0)
                {
            USART_SendData(USART1, *pUSART1_TxBuff++);                    
                        USART1_TxCount--;
                        if(USART1_TxCount<=0)
            {
              /* Disable the USART1 Transmit interrupt */
              USART_ITConfig(USART1, USART_IT_TXE, DISABLE);  
                                USART1_SendSta=USART_SENDSTA_SUCC;
            }
                }     
  }       
}

使用特权

评论回复
地板
firstblood|  楼主 | 2015-10-7 18:19 | 只看该作者
上述程序中USART_SendData(USART1, *pUSART1_TxBuff++);   有应用的,,
找到这儿先关的原函数的:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}

使用特权

评论回复
5
firstblood|  楼主 | 2015-10-7 18:20 | 只看该作者
这回就不太明白了,请高手给解释下的吧,,看样子是采用指针的方式,但是还是不明白。

使用特权

评论回复
6
comeon201208| | 2015-10-7 19:09 | 只看该作者
这个是采用指针形式传递数据的,,不过像是将双字节的数据按照一个一维2空间大小的数组的形式处理的。

使用特权

评论回复
7
angerbird| | 2015-10-7 21:08 | 只看该作者
firstblood 发表于 2015-10-7 18:19
上述程序中USART_SendData(USART1, *pUSART1_TxBuff++);   有应用的,,
找到这儿先关的原函数的:
void US ...

主要是集中在这个地方处理的,我也没怎看明白的

使用特权

评论回复
8
smilingangel| | 2015-10-7 21:44 | 只看该作者
我也有楼上同感的,,这里针对该寄存器的是怎样操作的呢?

使用特权

评论回复
9
smilingangel| | 2015-10-7 21:50 | 只看该作者
这是我从技术文档上看的关于寄存器的说明的

UART-DR0.jpg (81.04 KB )

UART-DR0.jpg

使用特权

评论回复
10
smilingangel| | 2015-10-7 21:50 | 只看该作者
这是说明的

UART-DR1.jpg (118.51 KB )

UART-DR1.jpg

使用特权

评论回复
11
smilingangel| | 2015-10-7 21:50 | 只看该作者
还是没能理解的,也没搞清楚其工作机制的

使用特权

评论回复
12
zhangbo1985| | 2015-10-16 19:36 | 只看该作者
这个我也没看明白的,同样求解与大侠们

使用特权

评论回复
13
zhangbo1985| | 2015-10-16 19:37 | 只看该作者
按常理来说,UART的数据发送接收都是按照8位1字节进行的,,一下子将16位2字节的数据转成8位的,没看明白的

使用特权

评论回复
14
vivilzb1985| | 2015-10-21 23:57 | 只看该作者
firstblood 发表于 2015-10-7 18:19
上述程序中USART_SendData(USART1, *pUSART1_TxBuff++);   有应用的,,
找到这儿先关的原函数的:
void US ...

其实问题关键在这个地方的,

使用特权

评论回复
15
mgiga| | 2015-10-22 15:20 | 只看该作者
本帖最后由 mgiga 于 2015-10-22 15:22 编辑
zhangbo1985 发表于 2015-10-16 19:37
按常理来说,UART的数据发送接收都是按照8位1字节进行的,,一下子将16位2字节的数据转成8位的,没看明白的 ...

转不转成八位的无所谓的吧,之所以在这里要转成八位的只是为了要符合原函数的参数类型,我试过将原函数的八位参数类型改成十六位的,然后调用函数的时候直接传十六位的数据,一样可以正常使用。究其原因,是因为串口在传数据的时候是一个ASCII一个ASCII传递的,跟你到底是要传多少字节的数据无关。

使用特权

评论回复
16
sanxinweiled| | 2015-10-23 17:36 | 只看该作者
三鑫维科技呗

使用特权

评论回复
17
shenmu2012| | 2015-10-26 19:19 | 只看该作者
mgiga 发表于 2015-10-22 15:20
转不转成八位的无所谓的吧,之所以在这里要转成八位的只是为了要符合原函数的参数类型,我试过将原函数的 ...

楼上说的是么?串口传输数据的都是按照二进制的最基本的数值发送的啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

86

主题

4492

帖子

9

粉丝