呵呵,这个问题很简单。比如你需要发送字符串"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语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)