⑴ c语言怎么实现串口通信
编程原理
程序1为查询通信方式接口程序,为一典型的数据采集例程。其中bioscom()函数初始化COM1(此函数实际调用BIOS
INT
14H中断0号功能)。这样在程序中就避免了具体设置波特率因子等繁琐工作,只需直接访问发送/接收寄存器(3F8H)和线路状态寄存
⑵ 请问c语言编写的串口通信里面 如何分别定义单个位(1个字节=8位)表达的意思
你可以不定义单个位变量,那样不好组合在一起,这样也可以:
unsigned char b;//声明字符型变量
unsigned char ch;//串口通信获得的数据
unsigned char else;//定义另一个字符变量
......
b = char & 0x80;//获得char的最高位
相同办法获得另一个字符的两位,再放到b中,switch(case)判断b的值就行了。
⑶ 串口通讯中要发送字符型数据接收时怎样判断接收完毕
你之前用的队列结构是完全可行的。
有几个问题你必须清楚:
1.
读取txt文件中的数据,txt中数据是死的,也就是说读取过程叫做
----
数据回放
2.
读取实际信息的数据,数据是活的,通常可以叫做
---
动态数据采集
(实时采集)
针对第一点来说:
数据回放,是指要求你把已经有的数据,按不同的时间段进行回放,这需要你对txt文件中的数据的格式,怎么回放,回放时间间隔把握好。
这个我建议你先不要做,因为数据回放
就是把数据一个个拿出来,再按时间排列去一个个显示出去,
不如实时采集来的直接。
第二点,
实时采集,
也就是说,数据来源可以有两种:
1.
真实数据。
2.
模拟数据。
在你之前的范例程序中,也就是“基础队列.vi”中,
在循环内部的随机数模块,就是模拟数据。
也就是说,是人为做的一个循环随机数。
而真实数据,
就是实际采集到的数据(替换模拟数据)。
真实数据来源有很多种,比如,串口通讯,接收到的不停变换的数据(动态数据)。
在最初做这个项目的时候,我的建议是,如果不了解
真实数据(板卡数据采集/通讯等),
那么就使用模拟数据,
在labview中有很多可以模拟的子VI,比如正玄波发生器等等。
或者,
人为造信号,比如之前的“基础队列.vi”中,范例造的随机数信号。
这里就涉及到你之前问的一个问题,
数
---
字符串
。
(这些是计算机基础知识)
字符在c语言中是char类型,在数据的传递中,
字符串是以ASCII码形式传输的,
说白了也是数
只不过比如“s”对应的ASC码数是“78”(没查表只是举例)。
在内存中占1个字节。
所以,当以字符串传递数据的时候,
数的表现形式往往是
人
看不懂的,因为是ASC码
所以,你传递整数,
传递字符串,其道理是一样的,只是如何能让人
来读懂这些数。
所以
“基础队列.vi”中的
随机数
vi
是以double双精度数传递的
一个
数,
而你所要做的就是
把
这个
随机数vi
换成
字符串的输出形式。
labview查找
数组转字符串
这个vi
或
字符串转8位数组
这个vi,
然后查看如何使用,可以帮助你,
而demo的
“基础队列.vi”程序可以保留,
你所要做的就是以上说的这些基础。
如果无法理解数据
传输
,以及相关的计算机基础
知识,
只能恶补了,现在很难几句说清楚啊
⑷ C语言变成实现串口收发数据
#include <reg51.h>
#include <intrins.h>
unsigned char key_s, key_v, tmp;
char code str[] = "welcome!www.willar.com
";
void send_str();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
void send_char(unsigned char txd);
sbit K1 = P1^4;
main()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
IE = 0x0; // 禁止任何中断
while(1)
{
if(scan_key()) // 扫描按键
{
delayms(10); // 延时去抖动
if(scan_key()) // 再次扫描
{
key_v = key_s; // 保存键值
proc_key(); // 键处理
}
}
if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
P0 = tmp; // 数据传送到P0口
send_char(tmp); // 回传接收到的数据
}
}
}
bit scan_key()
// 扫描按键
{
key_s = 0x00;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
// 键处理
{
if((key_v & 0x01) == 0)
{ // K1按下
send_str(); // 传送字串"welcome!...
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
void send_str()
// 传送字串
{
unsigned char i = 0;
while(str[i] != '