找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2559|回复: 0
收起左侧

串口驱动带协议

[复制链接]
ID:80436 发表于 2015-5-21 23:33 | 显示全部楼层 |阅读模式
  1. ////////////////////////////////////////////
  2. /**code by seabiscuit 谢海斌 九江 2016.4.10. 凌晨1点*/
  3. ////////////////////////////////////////////
  4. #include<avr/io.h>

  5. #define fosc 8000000
  6. #define baud 9600
  7. #define CALL 0X24  //主机呼叫
  8. #define BUSY 0X15  //从机忙
  9. #define OK   0X00  //从机准备好
  10. #define SUCC 0x2A  //接收成功
  11. #define ERR  0XF0  //接收错误

  12. #define MAXLEN 64  //缓冲区最大长度
  13. #define buf[MAXLEN];

  14. //----------------字符串输出函数----------------//
  15. void putchar(unsigned char c)
  16. {
  17. while(!(UCSR0A&(1<<UDRE0)));// 该位为1 表示数据发送准备好
  18. }


  19. //----------------字符串输入函数----------------//

  20. void getchar(unsigned char c)
  21. {
  22. while(!(UCSR0A&(!<<RXC0))); //RXC为1表示接收完成
  23. return UDR0;
  24. }
  25. //----------------接收数据函数----------------//
  26. unsigned char recvdatas(unsigned char *buff)
  27. {
  28. unsigned char i=0;
  29. unsigned char temp;
  30. unsigned char len; //保存数据长度
  31. unsigned char ecc; //保存校验字节
  32. len=getcahr();
  33. ecc=len;
  34. for(;i<len;i++)  //数据接收
  35. {
  36.   *buff=getchar();
  37.   ecc=ecc^(*buff); //进行字节校验
  38.   buff++;
  39. }
  40. *buff=0;           //数据接收结束
  41. temp=getchar(); //接收校验字节

  42. //数据校验
  43. ecc=temp^ecc;
  44. if(ecc!=0)  //如果校验错误
  45.   {
  46.    *(buff-len)=0;
  47.    putchar(ERR);
  48.    return 0XFF;  //返回0XFF表示校验错误
  49.   }
  50.   putchar(SUCC)  //发送校验成功信号SUCC
  51.   return 0;       //校验成功,返回0
  52. }

  53. //----------------串口初始化----------------//
  54. void init_serial()
  55. {
  56.   UCSR0B=(1<<RXEN0)|(1<<TXEN0)
  57.   UBRR0H=(fosc/16/(baud+1))/256
  58.   UBRR0L=(fosc/16/(baud+1))%256
  59.   UCSR0C=(0<<UMSEL01)|(0<<UMSEL00)|\
  60.   (1<<UCSZ01)|(1<<UCSZ00);
  61.   
  62. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表