c51语言编写,串口通讯程序,实现AT89S52单片机把一个整型数组数据,发送给VB

题意如上,例如怎样把unsigned int shuju [4096]={12345,54321} 这一数组里的数据经过字符转换后,发送给pc机上的VB接收程序存储起来!
我是菜鸟,还望各位高手不吝赐教,感谢!
积分全部奉上,虽然不多,但恳请各位给予援手,感激不尽啊(我想提高悬赏,却提示已达次数上限,郁闷)
unsigned int shuju [4096]={12345,54321}
怎样分“位”后,进行字符强制转换,并且在发送时怎样区分12345和54321这两个数据,利用for循环或其他方式分别发送12345和54321??? 因为{12345,54321}数据之间有“,”逗号

最好各位高手能提供些c51程序或相关实例,以促进鄙人的理解。

当单片机把字符型数据发送给pc机vb程序后,怎样再把数据还原为整型数组shuju [4096]={12345,54321}?
最新回答
微笑就像创可贴゜

2024-05-01 01:16:16

做一个整形到ASCII的转换函数。如果你要发送的数据最大值可以确定,可以根据最大值定义一个ASCII数组,数组的每一个单元存放整形数据的一位。
发送前先对发送整形数组里的单元转换成ASCII数组,然后再按照通用的发送函数进行发送。
void InttoChar (uint IntNumber)
//---------------------------------------------------------
// Name: void InttoChar (int IntNumber)
// Func.: Translate integer to ASCII charactor array
// Char.: IntNumber number to be translated to ASCII charactor
//---------------------------------------------------------
{
if (IntNumber < 10)
{
AsciiArray[0] = IntNumber + 0x30;
AsciiArray[1] = 0x20;
AsciiArray[2] = 0x20;
AsciiArray[3] = 0x20;
AsciiArray[4] = 0x20;
return;
}
if (IntNumber < 100)
{
AsciiArray[0] = IntNumber / 10 + 0x30;
AsciiArray[1] = IntNumber % 10 + 0x30;
AsciiArray[2] = 0x20;
AsciiArray[3] = 0x20;
AsciiArray[4] = 0x20;
return;
}
if (IntNumber < 1000)
{
AsciiArray[0] = IntNumber / 100 + 0x30;
AsciiArray[1] = IntNumber % 100 / 10 + 0x30;
AsciiArray[2] = IntNumber % 10 + 0x30;
AsciiArray[3] = 0x20;
AsciiArray[4] = 0x20;
return;
}
if (IntNumber < 10000)
{
AsciiArray[0] = IntNumber / 1000 + 0x30;
AsciiArray[1] = IntNumber % 1000 / 100 + 0x30;
AsciiArray[2] = IntNumber % 100 / 10 + 0x30;
AsciiArray[3] = IntNumber % 10 + 0x30;
AsciiArray[4] = 0x20;
return;
}
else
{
AsciiArray[0] = IntNumber / 10000 + 0x30;
AsciiArray[1] = IntNumber % 10000 / 1000 + 0x30;
AsciiArray[2] = IntNumber % 1000 / 100 + 0x30;
AsciiArray[3] = IntNumber % 100 / 10 + 0x30;
AsciiArray[4] = IntNumber % 10 + 0x30;
return;
}
}
词家小生

2024-05-01 07:07:37

单片机串口只能发送unsigned char 型的数据,所以要发送int型数据的话可以用分离变量法写一个函数,int型数据的每一位分离再发送。
比如发送 12 ,就 unsigned char shi=12/10;
unsigned char ge=12%10;
这样就把12的10位个位分开啦,当然这只是个比方,你可以把这种方法他写成函数,然后调用就可以啦。
如有疑问,请提出..
噢耶

2024-05-01 07:29:07

先把需要发送的数据转换成字符串,然后发送到PC上,在PC端需要把接收的字符串转换成数据。
有专门的库函数提供转换功能,当然这些函数自己也能写出来。
我这里根据你现有的情况,简单提供一下所需要的库函数:
1、int atoi (char *string)
这个是把字符串转换成整型数。
简单例子:
#include <stdlib.h>
void tst_atoi (void) {
int i;
char s [] = "12345";
i = atoi (s); //这里的结果就是把字符串的“12345”,转换成了整型数据12345
}

2、long strtol (
char *string, /* string to convert */
char **ptr, /* ptr to subsequent characters */
unsigned char base);
功能:把字符串转换为有符号的长整型数据
简单例子:
#include <stdlib.h>
#include <stdio.h>
void tst_strtol (void) {
long l;
char s [] = "-123456789stuff";
char *p;

l = strtol (s, &p, 10); //这里的l就等于 -123456789 ,为有符号整型数据
printf ("strtol(%s) = %ld\n", s, l);

// 指针p指向"stuff"
}

希望对你有帮助,个人邮箱为:
ppt1845@163.com
小卟忍则乱我心

2024-05-01 08:06:21

楼上的是个方法,但是假如数组里的数据是不定的,并非你初始化完成的呢?譬如AD采样 需要把采样值送给PC 这样的做法就不合理 一般是把数据分“位”分出来 如发送12345,得先把1提出在加48(0的ASCII码)2提出在加48(0的ASCII码),3提出在加48(0的ASCII码)……发完5个字节之后加发个0x20(空格的ASCII码)用于区别2个数据
真相是假

2024-05-01 09:05:37

?高难度问题