STC89C52与PC串口通讯怎么发字符串求程序!我单字符发成功了,就是字符串不知道怎么弄

STC89C52与PC串口通讯怎么发字符串求程序!我单字符发成功了,就是字符串不知道怎么弄,第1张

呵呵,这个问题很简单。比如你需要发送字符"i can help you!"共计15个字符,那么你可以用一个数组比如sendBuf[15]="i can help you!";然后,你在发送的时候写一个for循环就行咯:

for(i=0;i<15;i++)

{

SBUF=sendBuf[i];

while(!TI); //等待发送完毕

}

在接收的时候也是一样的:定义接收缓冲区receiveBuf[15];

然后中断里面的接收语句体为:

void ser() interrupt 4

{

RI=0;

receiveBuf[m++]=SBUF;//注意m为全局变量

if(m==15)//接收完毕

{

flag=1;

m=0;

}

}

这样接收完毕之后,接收缓冲区的内容就是你需要的字符串了。

OVER。

ASCII码在单片机中也是用16进制来表示的,只是解码后显示的是字符,你要是随便发一个字符,串口调试助手选择字符显示接收就可以显示一个字符出来(可能我们不认识这个字符)。发送一个字符串就是不停的发送直到发送完毕,51单片机有自己的串行发送端口P30和P31端口,但是它是一个字节一个字节发送的,发送完一个字节会产生一个中断(也可以用判断TI的方式判断是否发送完),中断响应后再次启动发送SBUF=0Xxx,就会自动连续的发送,再加上判断就可以控制发送的字节数。

串口初始化:

void uart_init()

{

TMOD=0x20;//定时器1,模式2

SCON=0x50;//串口通讯方式1

TH1=0xfd;//波特率9600

TL1=0xfd;

button=0;

delay(1);

TI=0;//发送中断标志位清零

RI=0;//接收中断标志位清零

TR1=1;//启动定时器1

EA=1; //使能全局中断

ES=1; //启动串口中断

}

}

void main()

{ P1=0xff;

uart_init() ;

while(1)

{

}

// 串行中断程序

void commIntProc() interrupt 4

{

if(TI)

{

TI = 0;

if(sendPosi < sendCount) //判断是否发送完成

{

sendPosi++; //发送一次计数器加一

SBUF = sendBuf[sendPosi];//启动发送

}

uchar idata SystemBuf[10]; //用于接收

uchar Rx=0; //接收数据条数

uchar code AT[]="YES,IT IS";

void UART_init (void)

{

TMOD=0x20; //用定时器1

PCON=0x00; //波特率不加倍

SCON=0x50; //串行方式1

TH1=0xFD; //9600

TL1=0xFD; //

EA=1; //

ES=1; //

TR1=1;

}

void sendchar(uchar ch) //串口送一个字节

{

SBUF=ch;

while(TI==0);

TI=0;

}

void sendstring(uchar p) //送字符串

{

while(p)

{

sendchar(p);

p++;

}

}

///////

void receive(void) interrupt 4 using 1 //中断

{

if(RI)

{

if(Rx<10) //这儿最多收10个字节

{

SystemBuf[Rx]=SBUF;

Rx++;

}

RI=0;

}

}

///

void main()

{

uchar i;

UART_init();

while(1)

{

if(SystemBuf=='S')

{

sendstring(AT);

for(i=0;i<10;i++) //接收清0

{

SystemBuf[i]=0;

}

Rx=0;

}

}

}

//////////如有小错误,自己调下,手打的,大小写可能不正常,这是标准程序,直接用,

比如下面的代码:Private Sub Command1_Click()

Dim data() As Byte

Dim i, h1, h2 As Long

i = 0

data = StrConv("测试", vbFromUnicode)

h1 = FindWindow(vbNullString, "form1")

h2 = FindWindowEx(h1, 0, "ThunderTextBox", "")

While i <= UBound(data)

PostMessage h2, WM_CHAR, data(i), 0

DoEvents

i = i + 1

Wend

End Sub以上代码是给form1窗口的文本框发送“测试”两个字,注意要用postmessage函数,因为用sendmessage时要等待响应后才返回,所以很容易卡死,postmessage是直接返回结果的

定义一个变量 int 的

接收中断到来的时候,变量清零

在单片机的接收中断在的一个接收周期内,连续判断A的出现,出现一次变量加一

当接收中断完成后,发送变量的值到电脑,

这样就完成字符A,数量的统计

串口发送时,并不区分什么类型的变量。

p,它无论是字符 'A',还是数字 28,它都可以发送出去。

串口发送时,每次仅仅能发送一个字节。

超过一个字节的变量,就需要分解。

一般是用钩子程序的。

比较复杂,只能说个大体思路,要花最少30分钟。分太少了。

API函数的声明就不说了。

先用findwindow找到窗体,用GetWindow和GetClassName获得其窗体内各对象的句柄,从而可以获得文本框的句柄。

最后用SendMessage函数想文本框发送文本。

tWnd = FindWindow(vbNullString, "窗口名")可以获得外部程序窗口的句柄twnd

bwnd = GetWindow(tWnd, GW_CHILD)可以获得该窗口子对象的集合句柄bwnd

Do Until bwnd = 0

GetClassName bwnd, sSave, 250

If InStr(1, UCase(sSave), "EDIT", vbTextCompare) <> 0 Then

editwnd = bwnd

Exit Do

End If

bwnd = GetWindow(bwnd, GW_HWNDNEXT)

Loop

以上代码可以读到该窗口中的第一个文本框的句柄editwnd

SendMessage editwnd, WM_SETTEXT, 6, "王小明"

以上代码向editwnd中写入“王小明”,6表示其长度。该方法写入时,文本框中原有内容全部覆盖。

以上就是关于STC89C52与PC串口通讯怎么发字符串求程序!我单字符发成功了,就是字符串不知道怎么弄全部的内容,包括:STC89C52与PC串口通讯怎么发字符串求程序!我单字符发成功了,就是字符串不知道怎么弄、怎么用51单片机向串口调试助手发送字符串有程序解释更好啊,求解~、用单片机串口向电脑串口调试助手发送一个字符串,用C语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9647567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存