咨询电话
ENGLISH0755-86329511发布时间:2021-04-27 11:33:07 |来源:网络转载
本文介绍了单片机与PC机之间的串行通信和RS232串行通信总线标准,以称重仪表作为下位机,以计算机作为上位机,以RS232作为两者之间的通信总线。利用VC++的MSComm控件开发上位机程序,实现了称重仪表与计算机的串行通信。
称重仪表是人们生活中所见的最为广泛的一种仪表,随着电子科技,称重技术等各门学科的发展,现在的称重仪表已不仅仅是将重量显示出来,而增加了许多新的功能,如串行通信、打印等。该文主要介绍称重仪表的串行通信,在仪表与计算机的通信中,主要是利用单片机的串行口来实现串行通信,将单片机与计算机相连构成上下位机的结构,以扩展控制界面,实现人机交互。称重控制器所用的单片机是SYNCMOS-SM8958A,属于8052系列单片机的派生产品。
1称重仪表串行通信
1.1RS232电平转换接口电路
单片机有一个串行通信接口,其接口标准为TTL标准,而计算机串口的接口标准为RS232C接口标准。它适合于数据传输率0~115200b/s范围内的通信。系统中串行通信在硬件上采用3线制RxD、TxD、GND软握手的零MODEM方式,仅需要3根线就可在两个数字设备之间实现全双工的数据传送,即将PC机和单片机的发送数据线TxD与接收数据RxD交叉连接,二者的地线GND直接相连,其他信号线可以不用,而采用软件握手方式。这样既可以实现预定的任务,又可以简化电路设计节约成本。但是计算机通过串行接口芯片,发送和接收的都是TTL电平表示的数字信息。它与TTLMOS逻辑电平完全不同,逻辑0电平规定为5~15V之间,逻辑1是电平为-5~-15V之间。因此在将计算机和单片机的RxD和TxD交叉连接时,必须进行电平转换,采用MAXIM公司的MAX232来做电平转换。MAX232属于MAXIM公司的通用串行接收/发送驱动芯片。其外围电路简单,只需外接4个0.1μF的电容即可,MAX232将计算机的TxD端输出的TTL电平信号转换为RS232C电平,输出到单片机的RxD引脚。
00方式0同步移位寄存器foso/1201方式110位异步收发由定时器控制10方式211位异步收发foso/32或foso/6411方式311位异步收发由定时器控制 SMO,SM1为串行口工作方式选择位,在文中SM0、SM1为0、1,即串口工作在方式1,该方式为10位一帧的异步串行通信方式,其波特率是可变的,由定时器控制,1位起始位,8位数据位,1位停止位,无奇偶校验位。
1.2单片机串行通信
SM8958A系列单片机通过外部引脚RxD(P3.0,串行数据接收端)、TxD(P3.1,串行数据发送端)向用户提供一个可编程的全双工串行通信接口。发送缓冲器和接收缓冲器都是以8031内部特殊功能寄存器SBUF的名义存在的,两个缓冲寄存器公用一个地址99H,可以用读/写指令区分。要发送数据时只需使用“MOV
SBUF,A”写指令,CPU把累加器A的内容写入发送的SBUF(99H),再由TxD引脚一位一位地向外发送;串行接收数据时,接收端RxD一位一位地接收数据再通过“MOVA,SBUF”读指令,CPU从接收的SBUF(99H)读出数据,送到累加器A中。发送和接,直到收到一个完整的字符数据后通知CPU,
收数据过程采用中断方式,从而可以大大提高CPU的利用效率。
单片机的UART接口是一个全双工的串行接口,它能同时发送和接收数据。单片机的UART接口有4种工作方式,需要对串行口控制寄存器SCON的设置来定义串行口的工作方式和控制它的功能。
SM0和SM1为工作方式选择位
;RI为接收中断标志;TI为发送中断标志;RB8为接收数据第9位;TB8为发送数据第9位;REN为接收控制;SM2为多极通信。串行口的控制寄存器SCON控制串行口的工作方式和波特率,发送和接收过程采用中断方式。
SCON的TI或RI引发内部串行口中断或通过内部查询完成中断功能,波特率发生器可用定时器T/C1或T/C2设置。SM8958A有一个标准的串行口,有4种工作方式。通过对串口控制寄存器SCON进行编程完成串口的初始化。单片机可以采用汇编或者C语言,通过对单片机的串口编程,从串口把数据发送给计算机。
SMO,SM1为串行口工作方式选择位,在文中SM0、SM1为0、1,即串口工作在方式1,该方式为10位一帧的异步串行通信方式,其波特率是可变的,由定时器控制,1位起始位,8位数据位,1位停止位,无奇偶校验位。[page]
1.3单片机串行通信程序设计
称重控制器仪表的单片机程序是在KeilC51编译器下编写,串行口输入采用查询方式,输出采用中断方式。voidIRQ_UartSio(void){if(SSR0_PER==1){SET_PARITY_ERROR; /3产生奇偶检验错误标志3/SSR0&=0x03;}/3奇偶检验错误标志位清零3/elseif(SSR0_OVE==1){SET_OVERRUN_ERROR; /3产生溢出位错误标志3/SSR0&=0x03;}/3溢出错误标志位清零3/elseif(SSR0_FER==1){SET_FRAMING_ERROR; /3产生数据帧位出错标志3/SSR0&=0x03;00方式0同步移位寄存器foso/1201方式110位异步收发由定时器控制10方式211位异步收发foso/32或foso/6411方式311位异步收发由定时器控制
SM0SM1相应工作方式说明所用波特率
}/3继续接收数据}/3数据帧标志位清零3/
else
if((SSR0_RDRF==1)&&(!IS_RCVEND))
/3开始接收数据3/
{
temp=RDR0;
if((++uart.rbuf_len>40)||(temp==0x0A))
/3数据接收完毕3/
{
uart.rbuf_len--;
SET_RCVEND;
}
else
}
else
if(SSR0_TDRE==1)/3发送数据3/if((3uart.tbuf_index==’\0’)||((uart.tbuf_index-uart.tbuffer)>49)){SMC20_TXE=0;/3发送结束3/SET_SEDEND;}else{TDR0=3uart.tbuf_index;uart.tbuf_index++;}/3继续发送数据3/}
上位机串行通信程序设计
利用MSComm控件进行上位机串口编程。
串行通信控件MSComm32.OCX是Windows下串行通信编程的32位ActiveX控件。事件驱动法是MSComm处理通信问题的一种方法。OnComm事件还可以检查和处理通信错误。每当有新的字符到达,或端口状态改变或发生错误时,MSComm控件触发OnComm事件,从而获取并处理这些通信事件。同时CPU无需不断测试串口,这种方式的优点是程序响应及时,可靠性高。
1)初始化并打开串口。对串口的初始化主要包括以下几个属性的设置:通过CommPort属性设置通信端口号;通过HandShaking属性设置通信协议;通过Setings属性设置传输速率等参数;再根据具体需要设置其他一些相关属性。在初始化完串口后通过将PortOpen属性设为True即打开了串口。
2)捕捉串口事件。采取比较广泛使用的事件驱动的方式,在OnComm事件里捕捉通信事件并进行相应的处理。3)串口数据的读写。串口的读写主要通过In2{put和Output属性。从串口读入的数据在Input里,3uart.rbuf_index=temp;直接调用即可读取,而把要发送的数据赋值给Out2uart.rbuf_index++;3/put即可。注意这里的数据分两种情况,字符串和二进制。
[page]4)串口的关闭。将PortOpen属性设置为False即可关闭串口。控件的主要属性设置如下:m_MSComm.SetCommPort(1);//选择COM1m_MSComm.SetInBufferSize(1024);//接收缓冲区m_MSComm.SetOutBufferSize(1024);//发送缓冲区m_MSComm.SetInputLen(0);//设置当前接收区的数据长度,为0表示全部读取m_MSComm.SetInputMode(1);//以二进制方式读写数据m_MSComm.SetRThoushold(1);//接收缓冲区有一个及一个以上字符时,将引发OnComm事件m_MSComm.SetSettings(“9600,n,8,1”);//波特率9600,无奇偶校验,8个数据位,1个停止位
voidCCommTestDlg::OnSend()
{
if(!m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE);//打开串口
UpdateData(TRUE);
m_Comm.SetOutput(COleVariant(m_SendDa2
ta));
//发送数据}voidCCommTestDlg::OnClear()
{m_ReceiveData.Empty();//清除接收对话框中的数据m_SendData.Empty();//清除发送对话框中的数据
UpdateData(FALSE);
}voidCCommTextDlg::OnComm(){
VARIANTm_Input1;COleSafeArraym_Input2;longlength,i;BYTEdata[1024];CStringstr;if(m_Comm.GetCommEvent()==2)
length=m_Input2.GetOneDimSize();
//确定数据长度
for(i=0;i
{
m_Input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
}
for(i=0;i
//将数组转换为CString型变量
{
BYTEa=3(char3)(data+i);
str.Format("%c",a);
}
}
UpdateData(FALSE);//更新编辑框内容
}
m//读取缓冲区内的数据_Input1=m_Comm.GetInput();
//接收缓冲区有字符m_Input2=m_Input1;//将Variant型变量转换为COleSafeArray变量信。
{
3结论
该文以称重仪表与计算机进行数据通信为例,着重介绍了单片机与计算机之间的串行通信和RS232串行通信总线标准,利用VisualC++的MSComm控件实现了双方的串行通信。
本文源于网络转载,如有侵权,请联系删除
深圳市卓禾仪器有限公司是一家专门从事称重仪表和全自动包装码垛生产线的研发及生产的高新技术企业,所生产的JY500系列称重显示控制器(包括配料秤仪表、皮带秤仪表、包装秤仪表、重量变送器等)高速高精度,使用寿命长。卓禾仪器有十数年的现场校验经验,在业内有良好的口碑,且有专门的售后工程师帮忙解决产品使用过程中遇到的技术问题,客户可以放心省心顺心的使用我司的产品。如果对我司的产品感兴趣,欢迎咨询。