[求助] atmega328UART传输速度有多快

四十岁   2015-7-3 14:19 楼主
为什么我使用atmega328传输数据这么慢,每个字节长达1ms。下面是我在arduino IDE环境下写的代码
  1. #define FOSC 16000000 // Clock Speed
  2. #define BAUD 9600
  3. #define MYUBRR FOSC/16/BAUD-1

  4. long num=0;

  5. void USART_Init( unsigned int ubrr)
  6. {
  7. /*Set baud rate */
  8. UBRR0H = (unsigned char)(ubrr>>8);
  9. UBRR0L = (unsigned char)ubrr;
  10. /*Enable receiver and transmitter RXEN0=4,TXEN0=3*/
  11. UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  12. /* Set frame format: 8data, 2stop bit */
  13. //UCSR0C = (1<<USBS0)|(3<<UCSZ00);
  14. }

  15. void USART_Transmit( unsigned char data )
  16. {
  17. /* Wait for empty transmit buffer */
  18. while ( !( UCSR0A & (1<<UDRE0)) )
  19. ;
  20. /* Put data into buffer, sends the data */
  21. UDR0 = data;
  22. }

  23. void setup(  )
  24. {
  25. USART_Init(MYUBRR);
  26. //Serial.begin(9600);
  27. pinMode(13,OUTPUT);
  28. }
  29. void loop()
  30. {
  31. // Serial.println("ok");
  32.   USART_Transmit(0x45);
  33.   USART_Transmit(0x43);
  34.   USART_Transmit(0x42);
  35.   USART_Transmit(0x41);
  36.   USART_Transmit(0x40);
  37.   USART_Transmit(0x39);
  38.   USART_Transmit(0x38);
  39.   USART_Transmit(0x37);
  40.   num++;
  41.   if(num>1000)
  42.   digitalWrite(13,HIGH);
  43.   else
  44.   digitalWrite(13,LOW);
  45.   if(num>2000)
  46.   num=0;
  47. // delay(100);
  48. }

我测算了下。每次亮灭需要16s。也就是说每次循环占用了8ms。但是我把
USART_Transmit(0x45);
  USART_Transmit(0x43);
  USART_Transmit(0x42);
  USART_Transmit(0x41);
  USART_Transmit(0x40);
  USART_Transmit(0x39);
  USART_Transmit(0x38);
  USART_Transmit(0x37);
去掉后,每次循环只有几us。所以一个字节的传输占到了1ms。是不是我使用方式有问题啊?还是这款芯片就这速度?
新手求教

回复评论 (5)

自顶一下。
点赞  2015-7-3 14:23
你设置的波特率决定了它就是那么慢,,
点赞  2015-7-3 14:58
引用: EETUX 发表于 2015-7-3 14:58
你设置的波特率决定了它就是那么慢,,

我后来改到115200。发现就开始乱码了。好奇怪
点赞  2015-7-3 15:55
FOSC/16/BAUD-1
无法整除,而且事实上它导致偏离115200较大
点赞  2015-7-3 17:11
FOSC/16/BAUD-1
本身写得也不科学...
点赞  2015-7-3 17:19
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复