您当前的位置:首页 > 互联网教程

如何对串口SCI编程

发布时间:2025-05-15 00:02:23    发布人:远客网络

如何对串口SCI编程

一、如何对串口SCI编程

你肯定见过台式机箱后面的九针插头,以前计算机和外设都是通过它通信的,现在逐步被 usb取代,但是串口也是有自己的优势的,一是咱们上位机编程容易,而是传输距离远,你很少见过usb有很长的线吧。

SCI是 serial communication interface的缩写,也就是串行通信接口的意思。所谓串行,就是数据在发送和接受的时候,是一位一位进行的,当然对于我们编程来说,这些对我们没有影响。

先说说串口通信的硬件设计吧,单片机出来的 SCITX和 SCIRX都是 0V或 5v而电脑的串口电平我原来测试过,是+10V或-10V,他们两个不能直接连接,所以需要一个电平转换芯片,通常我们采用 MAX232. TXD0接到单片机串口发送端,RXD0接到单片机接收端,DB_TX接到九针插头的 2脚,DBRX接 3脚,GND接 5脚,九针插头和电脑连接,这样单片机和计算机就能通信啦。怎么在电脑上看串口接收到的数据呢,这时就需要一款串口调试软件,我在资料里面给了。

好了下面将单片机编程。要实现串口通信,最关键的就是实现波特率的匹配,也就是传输速度要一致,电脑设置串口波特率为 9600,你单片机就要设成 9600才能通信,当然你设成 9601也问哈工大嵌入式开发 hitele.taobao.com题不大,不是 100%精确才能通信的,尽量吧!手册 420页中给出了串口波特率设置公式: SCI bus clock就是以前提到的 f BUS,在前面定时器和 PLL实验中都讲过,PLL实验中我们将 f BUS设置成了 40M。 SCIBR[12:0]由 SCIBDH和 SCIBDL决定(手册中 406页),这 SCIBDH设置 [12:8],SCIBDL设置[7:0],一共 13位。假如我们现在要设置波特率为9600,怎么设置呢? 9600=40 000 000/(16*SCIBR[12:0]) SCIBR[12:0]= 40 000 000/16/9600=260 260的十六进制是104H,也就是SCIBDH=0x01,SCIBDL=0x04.除了波特率寄存器外,还有两个寄存器比较重要,SCI0CR1和SCI0CR2 LOOPS置1:SCI的发送端在内部直接接到SCI的发送端,也就是自发自收,这主要用来编程期间对程序进行测试。清0就进入正常模式。 M=0: SCI总线发送了1个起始位 8个数据位和一个结束位 M=1: SCI总线发送了1个起始位 9个数据位和一个结束位 PE=1:启用奇偶校验 PE=0:禁止奇偶校验 PT用来选择是采用奇校验还是偶校验。关于奇偶校验您可以百度一下,这里不做阐述了。哈工大嵌入式开发 hitele.taobao.com TIE=1:使能发送数据为空中断,也就是现在发送数据寄存器可以接收新数据了,你可以发送新数据了。 TCIE=1:使能发送完成中断,告诉你发送结束啦 RIE=1:使能接收中断 TE=1:发送使能 RE=1:接收使能最后一个重要的寄存器就是状态寄存器SCI0SR1 TDRE=1:标志着可以进行新的数据收发了 RDRF=1:标志着接收到了新数据实际应用:利用单片机每隔400ms向电脑发送一次“hitele”,每次接收到PC发送来的数据时,改变led状态。每隔400ms,利用前面讲过的定时器,回顾一下吧。串口发送编程: 1.先对SCI初始化 SCI0BDH=0x01; SCI0BDL=0x04;//将波特率设置为9600,注意这是在f BUS为40M的情况下设定的 SCI0CR1= 0x64;//设置串口接收端连接到外部; SCI0CR2= 0x2C;//启用接收中断;发送使能和接收使能 2.发送函数 void Sci0SendByte(unsigned char data){ while(!(SCI0SR1&0X80));//等待 TDRE为置 1,也就是等待什么时候可以发送新数据 SCI0DRL= data;//向数据寄存器写入要发送的数据,这样就发送出去了} 3.接收函数查询式接收:哈工大嵌入式开发 hitele.taobao.com unsigned char Sci0Read(){ while(!SCI0SR1_RDRF);//一直等待接收数据,直到接收到 SCI0SR1_RDRF=1;//读取数据寄存器会将RDRF清除重新置位 return SCI0DRL;//返回数据寄存器的数据}中断方式接收数据:#pragma CODE_SEG NON_BANKED void interrupt 20 SCI0_RE(void){ SCI0SR1_RDRF=1; SCI0DRL;//这两步是为了清除中断标志 DDRE|=0x60;/*0xC0=0110 0000,即将PE5、PE6设置成输出模式*/ PORTE=~PORTE;/*改变led状态*/}

二、VC++2005串口编程的问题

如果是RS232的话,VB我曾做过一个。

建两个多行文本框 text1 text2一个按钮发送,

MScomm串口控件。在添加控件中找到 Microsoft Comm Control 6.0或更高。

MSComm1.Output= Trim(Text2.Text)

写timer代码,先设定timer1属性为6秒则将Interval设为6000

If MSComm1.InBufferCount= 0 Then GoTo 20

text1.Text= text1.Text+ vbCrLf+ Instring+""+ Trim(Str(Date))+""+ Trim(Str(Time))

text1.SelStart= Len(text3.Text)

我这里设计需要,所以是6秒,并在最后输出接收日期和时间,且数据累积。目的是为了保存文本。并且保持光标在最后输出数据结果,当多行文本框满了后不用向后翻。

若用本机测试回路别望了短接串口输入、输出。