整了一天程序,写了个上位机程序和单片机程序。总结下。。。
上位机部分:
相关参考资料:http://wenku.baidu.com/view/5ea8670403d8ce2f00662322.html
1.先添加各控件,添加后的对话框如下图:
2.再添加对应的成员变量。
3.最后添加函数(事件处理函数)。
3.1初始化,设置串口各参数。
BOOL CLedControlDlg::OnInitDialog() { CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_ctrlComm.put__CommPort(5); //选择com3 m_ctrlComm.put_InputMode(1); //以二进制方式输入 m_ctrlComm.put_InBufferSize(1024); m_ctrlComm.put_OutBufferSize(512); //设置串口,波特率115200,无校验位,数据位8,停止位1 m_ctrlComm.put_Settings(_T("115200,n,8,1")); //参数1表示当接受缓冲区有多于等于1个字符 //引发OnComm m_ctrlComm.put_RThreshold(1); if (!m_ctrlComm.get_PortOpen()) { m_ctrlComm.put_PortOpen(TRUE);//打开串口 } m_ctrlComm.put_InputLen(0); //设置当前缓冲区为0 m_ctrlComm.get_Input(); //先预读缓冲区 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } |
3.2处理串口发来的数据。
void CLedControlDlg::OnComm() { // TODO: 在此处添加消息处理程序代码 VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.get_Input(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k { BYTE bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strEditRXData+=strtemp; //加入接收编辑框对应字符串 } } UpdateData(FALSE); //更新编辑框内容 } |
3.3串口发送数据出去。
void CLedControlDlg::OnButtonManualsend() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); m_ctrlComm.put_Output(COleVariant(m_strEditTXData)); UpdateData(false); } |
单片机部分:
#include #include #include #include #include #define _Nop() _nop_() #define uchar unsigned char #define uint unsigned int #define LEDCTL0Low P4&=~0x01; #define LEDCTL0High P4|=0x01; #define LEDCTL1Low P4&=~0x02; #define LEDCTL1High P4|=0x02; #define LEDCTL2Low P4&=~0x04; #define LEDCTL2High P4|=0x04; #define LEDCTL3Low P4&=~0x08; #define LEDCTL3High P4|=0x08; //-------------------------------------------------------------------- // 全局常量 //-------------------------------------------------------------------- #define SYSCLK 22118400 // SYSCLK frequency in Hz #define BAUDRATE 115200 // Baud rate of UART in bps #define MAX_LEN 50 //receive buf MAX length uchar readCounts; uchar trdata[MAX_LEN] = {'0', '0', '0', '0'}; //四个LED数码管初始显示都为0 uchar sendlen; uchar message[]="Receive Buf is full"; bit readFlag; bit frameFlag; char data SFRPAGE_SAVE; uchar code LEDSEG1[]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xc6,0X89};//0~9,C,H,正 uchar code LEDSEG2[]= {0xC0,0xCF,0xA4,0x86,0x8B,0x92,0x90,0xC7,0x80,0x82,0xF0,0X89};//0~9,C,H,倒 //-------------------------------------------------------------------- //函数声明 //-------------------------------------------------------------------- void SYSCLK_Init (void); void PORT_Init(void); void UART0_Init(void) ; void Send_Char(uchar ch) ; void send_string_com(unsigned char *str,unsigned int strlen); void display(unsigned char *str); void Delay(uint tt); //-------------------------------------------------------------------- // 主函数 //-------------------------------------------------------------------- void main (void) { WDTCN = 0xde; WDTCN = 0xad; //关闭WDT SYSCLK_Init (); PORT_Init(); UART0_Init(); EA=1; ES0=1; SFRPAGE = LEGACY_PAGE; while(1) { if (frameFlag) { frameFlag=0; send_string_com(trdata,sendlen); } display(trdata); } } //----------------------------------------------------------------------------- // 系统时钟配置 //----------------------------------------------------------------------------- void SYSCLK_Init (void) { int i = 0; //char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page SFRPAGE = CONFIG_PAGE; // set SFR page OSCXCN = 0x67; // start external oscillator with // 22.1184MHz crystal for (i=0; i < 3000; i++) ; // XTLVLD blanking interval (>1ms) while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle CLKSEL = 0x01; //SYSCLK derived from the External Oscillator circuit OSCICN &= ~0x80; //Internal Oscillator Disabled } //----------------------------------------------------------------------------- // I/O配置 //----------------------------------------------------------------------------- void PORT_Init() { SFRPAGE = CONFIG_PAGE; // set SFR page before writing to // registers on this page XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100 XBR1 = 0x00; XBR2 = 0x40; //交*开关使能 P0MDOUT |= 0x01; /*使能TX0作为推挽输出*/ P4MDOUT = 0xff; P5MDOUT = 0xff; //推挽输出 } //----------------------------------------------------------------------------- //串口初始化 //CONFIG_PAGE=0x0F;UART0_PAGE=0x00;TIMER01_PAGE=0x00; //----------------------------------------------------------------------------- void UART0_Init(void) { SFRPAGE = UART0_PAGE; SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX SSTA0 = 0x10; // SMOD00 = 1 TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate TR1 = 1; // start Timer1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base TI0 = 1; // Indicate TX0 ready } //----------------------------------------------------------------------------- //发送单个字符 //----------------------------------------------------------------------------- void Send_Char(uchar ch) { SBUF0 = ch; //送入缓冲区 while(TI0 == 0); //等待发送完毕 TI0 = 0; //软件清零 } //----------------------------------------------------------------------------- //向串口发送一个字符串,strlen为该字符串长度 //----------------------------------------------------------------------------- void send_string_com(unsigned char *str,unsigned int strlen) { unsigned int k=0; do { Send_Char(*(str + k)); k++; } while(k < strlen); } //----------------------------------------------------------------------------- //UART0中断服务程序. 接收字符 //----------------------------------------------------------------------------- void UART0_ISR(void) interrupt 4 using 1 { uchar rxch; if(RI0) //中断标志 RI0=1 数据完整接收 { RI0 = 0; //软件清零 rxch = SBUF0; //读缓冲 8i trdata[readCounts] = rxch; //存入数组,供发送 readCounts++; if (readCounts >= 0x04) //字符串结束标志 { frameFlag=1; sendlen= 4; readCounts = 0; } } } void Delay( uint tt ) { while( tt-- ); } void display(unsigned char *str) { SFRPAGE_SAVE = SFRPAGE; SFRPAGE = CONFIG_PAGE; P5=LEDSEG1[*(str + 0) - '0']; LEDCTL0Low; Delay(500); LEDCTL0High; P5=LEDSEG1[*(str + 1) - '0']; LEDCTL1Low; Delay(500); LEDCTL1High; P5=LEDSEG2[*(str + 2) - '0']; LEDCTL2Low; Delay(500); LEDCTL2High; P5=LEDSEG2[*(str + 3) - '0']; LEDCTL3Low; Delay(500); LEDCTL3High; SFRPAGE = SFRPAGE_SAVE; } |
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』