高手帮帮小弟吧!

[复制链接]
 楼主| gsypuma 发表于 2007-7-31 14:51 | 显示全部楼层 |阅读模式
<br />&nbsp;&nbsp;&nbsp;我是一位在校的学生,在编写串口程序时遇到些问题,半个月也没有解决,希望大家帮助解决一下。<br />问题是这样:<br />&nbsp;&nbsp;&nbsp;&nbsp;我要做一个pda与单片机的串口通信,pda部分是在visual&nbsp;studio&nbsp;2005&nbsp;的vb中写的,已经可以用串口调试助手于pc进行通信。<br />程序如下:<br />Public&nbsp;Class&nbsp;Form1<br />&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;F&nbsp;As&nbsp;Long,&nbsp;T&nbsp;As&nbsp;Long,&nbsp;First&nbsp;As&nbsp;Long,&nbsp;TH0&nbsp;As&nbsp;Byte,&nbsp;TL0&nbsp;As&nbsp;Byte,&nbsp;i&nbsp;As&nbsp;Integer<br />&nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;Sub&nbsp;Form1_Load(ByVal&nbsp;sender&nbsp;As&nbsp;System.Object,&nbsp;ByVal&nbsp;e&nbsp;As&nbsp;System.EventArgs)&nbsp;Handles&nbsp;MyBase.Load<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.CommPort&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.PortOpen&nbsp;=&nbsp;True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.Settings&nbsp;=&nbsp;&quot;9600,N,8,1&quot;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;With&nbsp;SerialPort<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.PortName&nbsp;=&nbsp;&quot;COM1&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.BaudRate&nbsp;=&nbsp;9600<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.DataBits&nbsp;=&nbsp;8<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.StopBits&nbsp;=&nbsp;IO.Ports.StopBits.One<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Parity&nbsp;=&nbsp;IO.Ports.Parity.None<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.ReadTimeout&nbsp;=&nbsp;1000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;With<br />&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;Sub<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;Sub&nbsp;Button1_Click(ByVal&nbsp;sender&nbsp;As&nbsp;System.Object,&nbsp;ByVal&nbsp;e&nbsp;As&nbsp;System.EventArgs)&nbsp;Handles&nbsp;Button1.Click<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F&nbsp;=&nbsp;Val(TextSend.Text)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'确定发射频率<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;=&nbsp;11059200&nbsp;\&nbsp;(24&nbsp;*&nbsp;F)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'计算定时器定时时间<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;First&nbsp;=&nbsp;&HFFFF&nbsp;-&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'计算定时器初值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TL0&nbsp;=&nbsp;&HFF&nbsp;And&nbsp;First&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'计算定时器初值低八位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TH0&nbsp;=&nbsp;(First&nbsp;-&nbsp;TL0)&nbsp;/&nbsp;&H100&nbsp;&nbsp;&nbsp;&nbsp;'计算定时器初值高八位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;TH0Hex<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;TL0Hex<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TH0Hex&nbsp;=&nbsp;Hex(TH0)&nbsp;&nbsp;&nbsp;'&nbsp;返回&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TL0Hex&nbsp;=&nbsp;Hex(TL0)&nbsp;&nbsp;&nbsp;'&nbsp;返回&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.PortName&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SerialPort.Open()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'打开串口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.BaudRate&nbsp;=&nbsp;&quot;9600&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.Parity&nbsp;=&nbsp;SerialPort.Parity.None<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.Open()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.WriteLineTextSend.Text)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SerialPort.Write(Val(TH0Hex))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'发送定时器初值高八位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextBox2.Text&nbsp;=&nbsp;TH0Hex<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SerialPort.Close()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'关闭串口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;i&nbsp;As&nbsp;Integer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;i&nbsp;=&nbsp;0&nbsp;To&nbsp;10000000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;i<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SerialPort.Open()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'打开串口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SerialPort.Write(Val(TL0Hex))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'发送定时器初值低八位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextBox2.Text&nbsp;=&nbsp;TL0Hex<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SerialPort.WriteLine(TextSend.Text)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SerialPort.Close()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'关闭串口&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;Sub<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;Sub&nbsp;Button2_Click(ByVal&nbsp;sender&nbsp;As&nbsp;System.Object,&nbsp;ByVal&nbsp;e&nbsp;As&nbsp;System.EventArgs)&nbsp;Handles&nbsp;Button2.Click<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.Exit()<br />&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;Sub<br />End&nbsp;Class<br />单片机部分就是要把接受到的高低八位给定时器,然后产生方波。用串口调试助手给单片机发数,已经可以工作程序如下:<br />#include&nbsp;&lthowevero.h&gt<br /><br />//逻辑<br />#define&nbsp;FALSE&nbsp;&nbsp;0<br />#define&nbsp;TRUE&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />//管脚定义<br />sbit&nbsp;std_cnt2&nbsp;=&nbsp;p1^2;<br />sbit&nbsp;std_cnt1&nbsp;=&nbsp;p0^1;<br />sbit&nbsp;std_cnt0&nbsp;=&nbsp;p0^0;<br />sbit&nbsp;std_cnt3&nbsp;=&nbsp;p0^3;<br /><br /><br />//函数声明<br />void&nbsp;serial_init(void);//串口初始化<br />void&nbsp;serial_send(void);<br /><br /><br />//全局变量声明<br />unsigned&nbsp;int&nbsp;idata&nbsp;send_letter;<br />//unsigned&nbsp;long&nbsp;&nbsp;data&nbsp;tempnumber=0;<br />unsigned&nbsp;char&nbsp;numberhigh,numberlow;<br />int&nbsp;i=0;<br />unsigned&nbsp;&nbsp;int&nbsp;data&nbsp;temp;<br /><br />/************&nbsp;主函数**************************/<br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SP=0x60;<br />//&nbsp;&nbsp;&nbsp;&nbsp;interupt_init();<br />&nbsp;&nbsp;&nbsp;&nbsp;serial_init();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;std_cnt0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;std_cnt1=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;std_cnt2=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;std_cnt3=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(i==0);//等待中断<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*发射波形*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TH0=numberhigh;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;TL0=numberlow;<br />&nbsp;&nbsp;&nbsp;&nbsp;TF0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;TR0=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(TF0==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TH0=numberhigh;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TL0=numberlow;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std_cnt3=!std_cnt3;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TF0=0;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TR0=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br /><br /><br /><br />/************&nbsp;串口初始化?*************************/<br />void&nbsp;serial_init()<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCON=0x50;&nbsp;&nbsp;&nbsp;//工作方式1,单机通讯,接收允许<br />&nbsp;&nbsp;&nbsp;&nbsp;TMOD=0x21;&nbsp;&nbsp;&nbsp;//方式1下波特率由SMOD和定时器1共同决定,定时器一工作在方式2下<br />&nbsp;&nbsp;&nbsp;&nbsp;TR0=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;PCON=0x00;&nbsp;&nbsp;&nbsp;//PCON=0x00速度不加倍<br />&nbsp;&nbsp;&nbsp;&nbsp;TH1=0xFD;&nbsp;&nbsp;TL1=0xFD;&nbsp;&nbsp;//计数初值,晶振11.0592M,波特率9600,<br />&nbsp;&nbsp;&nbsp;&nbsp;TR1=1;&nbsp;&nbsp;&nbsp;//启动定时器<br />&nbsp;&nbsp;&nbsp;&nbsp;ET0=0;&nbsp;EX0=1;&nbsp;ES=1;&nbsp;&nbsp;EA=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;EX1=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;PS=1;<br />}<br /><br />/************&nbsp;串口中断函数**************************/<br />void&nbsp;serial_receive(void)&nbsp;interrupt&nbsp;4&nbsp;using&nbsp;1<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;std_cnt3=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出低电平(未发射方波时)<br />&nbsp;&nbsp;&nbsp;&nbsp;for(temp=0;temp&lt2;temp++)&nbsp;//连续接收2个字节&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(temp)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0:numberhigh=SBUF;while(RI==0);RI=0;break;//给出定时器初值高八位,并等待下个串行中断<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:numberlow=SBUF;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//给出定时器初值低八位,准备跳出中断<br />&nbsp;&nbsp;&nbsp;&nbsp;default:break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />}<br />可是,把pda与单片机连接到一起时,不管pda串口发什么频率数,单片机的频率是一定的,我半个多月都没想明白,希望高手帮忙指点一下!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 楼主| gsypuma 发表于 2007-8-1 15:38 | 显示全部楼层

有做过的吗?

帮看一看。
dyq117119 发表于 2007-8-3 08:05 | 显示全部楼层

re:

你的单片机程序能工作????有点奇怪!!!!
 楼主| gsypuma 发表于 2007-8-3 14:08 | 显示全部楼层

用上面的程序是可以与pc通信和工作的

但是现在我改成用定时器2工作了,现在连单片机与pc通信都不可以了,太奇怪了。
oudi 发表于 2007-8-7 07:45 | 显示全部楼层

是TTL电平和RS232电平没有统一的问题么?

  
 楼主| gsypuma 发表于 2007-8-14 14:54 | 显示全部楼层

PDA还是不能于单片机通信

但是,pda和单片机都可以于pc机通信。不知道什么原因
erhui_cn 发表于 2007-8-15 09:25 | 显示全部楼层

RE:

你的PDA是PDA里面的哪种?
 楼主| gsypuma 发表于 2007-8-20 14:52 | 显示全部楼层

问题解决了

问题在于pda和单片机的串口引脚不一样,真郁闷,卡了我这么久,我一直以为是程序的问题。
ch_worm 发表于 2007-8-31 15:00 | 显示全部楼层

回上帖

看你最后的帖子&nbsp;难道是引线没有交叉对接好??????&nbsp;<br />PDA都有串口座子的啊&nbsp;呵呵&nbsp;&nbsp;偶也有个老PDA&nbsp;<br />有时间还真想玩一下&nbsp;...&nbsp;嗯<br />偶的MSN&nbsp;&nbsp;呵呵<br />CH-littleworm@hotmail.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

140

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

32

主题

140

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部