21021|21

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在单片机中如何通过串口给仪器发送ASCII码! [复制链接]

在单片机中如何通过串口给仪器发送ASCII码!因为仪器串口协议已经有了,
1.串口协议
(1)8个数据位,1个停止位,无奇偶校验;
(2)波特率:2400、4800、9600、19200bps。
注意:修改了驱动器的波特率后,上位机也应修改为相同的波特率!
2.指令结构
驱动器采用ASCII 码指令与上位机通讯。
ASCII码指令的构成:
发送端:指令+(参数)+0x0D
回应端:#+数据+0x0D+0x0A
? 指令:仅使用字母的字符串;
? 参数:指令后为ASCII码数字,有些指令后面无参数;
? 结束符:发送端以0x0D(回车)结束,回应端以0x0D,0x0A(换行)结束;
? 字符不分大小写;
? 带有参数的指令如省略参数,则把参数识别为0;
? 如果指令错误或参数超出规定的范围,则驱动器将返回ERR+’d’
  d(范围):0~9,其中’1’表示数值范围错误,’2’表示无效指令,’3’表示当前位置不在位置范围之内,’4’表示设定速度超过最大速度限制(RS232速控模式);


有没有好的思路探讨一下。最好是用C语言编写,纠结中啊。

最新回复

众位楼主,如果想要用    单片机实现液晶显示的方案可以跟我索取。  dwin99@live.cn   详情 回复 发表于 2009-8-29 20:33
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
在单片机串口程序中发送字符串或者数组的方式行的通吗??????

形如:
发送端:MA10000 0x0D

我是通过单片机做为上位机给驱动器发送指令的,根据协议通信,然后控制驱动器。
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
发送ASCII需要纠结吗?
BUF = 'a';//就是发送字符a
单个字符,可以做一个SendChar(char c);
多个字符,你可以做个SendBytes(char* buf);
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 shuiyan 的回复:
发送ASCII需要纠结吗?
BUF = 'a';//就是发送字符a
单个字符,可以做一个SendChar(char c);
多个字符,你可以做个SendBytes(char* buf);

就是啊,不知道LZ要说什么,直接发送就行,把所要发送的字符值直接送到 串口缓冲区就行。51单片机我记得是SBUF.
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
应该只能发送ASC码吧
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
建议考虑以下几种情况:
1、通信模式有没有可能使用主从通信的方式(需要的话,可参照I2C协议先发送寻址字节,当然需要一个标志区分寻址字节与正常数据)
2、通信超时处理
3、实现方式(中断、查询),中断方式下,需要考虑中断处理时间与中断频繁程度,最好在中断中仅接受数据,使用Mutex信号量通知任务处理消息

本人是菜鸟......
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
加48就是ASCII码了啊
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
#include
#define uint unsigned int
uint i,j;
unsigned char flag,a;
void delay(uint);
void main()
{

        TMOD=0x20;//设置定时器1为工作方式2
        TH1=0xfd;//波特率是9600
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;//中断模式开
        ES=1;
        while(1)
                {
                /*        if(RI==1)查询方式
                        {
                        RI=0;
                        P1=SBUF;
                        }*/
                        if(flag==1)
                                {
                                        ES=0;
                                        flag=0;
                                        SBUF='M';//28;        字符串
                                        while(!TI);       
                                        TI=0;//定时器关
                                        SBUF='A';//28;       
                                        while(!TI);       
                                        TI=0;
                                        SBUF='2';//28;       
                                        while(!TI);       
                                        TI=0;
                                        SBUF='0';//28;       
                                        while(!TI);       
                                    TI=0;
                                        SBUF='0';//28;       
                                        while(!TI);
                                    TI=0;
                                    SBUF='0';//28;       
                                        while(!TI);
                                        TI=0;
                                        SBUF='0';//28;       
                                        while(!TI);
                                        TI=0;
                                        SBUF='0';//28;       
                                        while(!TI);
                                        TI=0;
                                        ES=1;
                                }
                               
        while(1)
                {
             if(flag==1)
                                {
                                        ES=0;
                                        flag=0;
                                        SBUF='F';//28;        字符串
                                        while(!TI);       
                                        TI=0;//定时器关
                                        SBUF='D';//28;       
                                        while(!TI);       
                                        TI=0;
                                        SBUF='h';//28;       
                                        while(!TI);       
                                        TI=0;
                                        SBUF='b';//28;       
                                        while(!TI);       
                                    TI=0;
                                        SBUF='8';//28;       
                                        while(!TI);
                                    TI=0;
                                    SBUF='0';//28;       
                                        while(!TI);
                                        TI=0;
                                        SBUF='0';//28;       
                                        while(!TI);
                                        TI=0;
                                        SBUF='0';//28;       
                                        while(!TI);
                                        TI=0;
                                        ES=1;
                                }
        }
}
}
/*延时i毫秒*/
void delay(uint i)
{
uint j;
    while(i--)
    {
    for(j=120;j<125;j++)
    {}
    }
}

void ser() interrupt 4
{
        RI=0;
//        P1=SBUF;
        a=SBUF;
        flag=1;
}



在keilC中编译通过,可是输出的只有“FDhb8000FDhb8000FDhb8000FDhb8000”。
我想要的结果是输出"MA20000"字符串后,延时120毫秒输出“FDhb8000”到串口。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
两个while(1)?两个if(flag==1)?这怎么实现延时呢?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
晕   你给SBUF里面 赋值0X00-0XFF的值不都行啊  ASCII表去查下就知道了 如果是数字就加个 '0' 不就是ASCII了吗?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
在此先谢谢大家的帮忙!目前问题已经有点眉目了!

有以下几个问题请教大家:
1:如果发送端:指令+(参数)+0x0D,程序中还需要怎么修改?因为最终输出要的是ASIIC码。
2:输出一组"MA20000",“F9608000,"M2880000"”字符串后将程序关闭。有没有好的操作办法?
3: 目前的输出是M2880000 MA20000 FD96000 间隔1200毫秒。理想输出MA200000 F9608000 M28800000x0D"




//要通过RS232通讯口控制驱动,指令格式如下
指令结构
驱动器采用ASCII 码指令与上位机通讯。
ASCII码指令的构成:
发送端:指令+(参数)+0x0D
回应端:#+数据+0x0D+0x0A
   指令:仅使用字母的字符串;
   参数:指令后为ASCII码数字,有些指令后面无参数;
   结束符:发送端以0x0D(回车)结束,回应端以0x0D,0x0A(换行)结束;

是不是可以在uchar a[7]={'M','A','2','0','0','0','0'};
中这样设置
如下:
uchar a[11]={'M','A','2','0','0','0','0'','0','x','0','D',};
指令是MA,参数是20000,0x0D是结束符号。


//程序要的结果是输出"MA20000"字“FD96000,"MD2880000x0D"”到串口。
//下面程序已经编译通过,在实验板上也通过了。

#include
#define uint unsigned int
#define uchar unsigned char
uchar a[7]={'M','A','2','0','0','0','0'};
uchar b[8]={'F','D','9','6','0','0','0','0'};
uchar c[12]={'M','D','2','8','8','0','0','0','0','x','0','D'};
void delay(uint i)   //延迟nMS函数
{
  uint k;
  while(i--)
  for(k=0;k <1200;k++){;}
}

void uini()   //串口初始化
{
  TMOD=0x20;
  TH1=0xfd;TL1=0xfd;
  TR1=1;
  SCON=0x50;
}

void main()
{
  uini();
  while(1)
  {
    uint i;
    for(i=0;i <7;i++) //发送第一个字符串
    {
    SBUF=a;
    while(!TI);      
    TI=0;
    }
    delay(1200); //延迟1200ms

            for(i=0;i <8;i++) //发送第二个字符串
    {
    SBUF=b;
    while(!TI);      
    TI=0;
    }
    delay(1200); //延迟1200ms
    for(i=0;i <12;i++) //发送第三个字符串
    {
    SBUF=c;
    while(!TI);      
    TI=0;
    }
    delay(1200); //延迟1200ms

  }
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
请教一下如何跳出上面的循环程序。就是输出后结束程序。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 
uping
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(高级)

14
 
我晕,发送接收应该单独写函数,在外面调用发送接收函数
void putchar(unsigned char * ucpBuffer,unsigned short wLen)
{
   unsigned char * p=ucpBuffer;
    while(wLen--)
    {
      if(*p == '\n')
      {
         SBUF = 0x0D;
      }
      *p++;
      while(!TI);      
      TI=0;
    }
}

void main()
{
    putchar("Uart Test\n", 10);
    while(1);
}
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

15
 
知道了在程序的后面加上 break可跳出三界。
修改如下:
  }
    delay(1200); //延迟1200ms
    break;
  }
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

16
 
在此先谢谢大家了!
现在就先做的是发数据,以后会用到接数据的。
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

17
 
没问题
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

18
 
这个应该不难哦
学习下了
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

19
 
顶下
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

20
 
单片机汇编指令一次只能发送一个字符,你要发送字串就要自己做个函数;既然你的上行和下行都制定了一定得规则,那么你的这个函数就应该包含这个简单的应用协议。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表