㈠ c语言同步和异步的区别
同步:代码立即执行
异步:代码程序先在队列排队,等到可以执行再去执行。
㈡ C语言问题
你这个程序是捕捉0到9的按键状态,按下再松开时才会记录,想要识别所有按键,把for循环范围扩大。
比如for(charch=32;ch<=127;ch++)这样就包含了特殊符号及大小写字母还有数字。
但是,这个代码是有问题的!
一、你这个代码需在键位已经按下后启动才能识别,否则启动时没有按下对应键位,程序就结束了。要嵌套死循环,让其一直检测。
二、直接扩大ASCII区间,像上面的那样32~127,识别字母区间会被防毒软件直接判断为病毒!!。
三、GetAsyncKeyState不是C语言库函数,是window的函数,换其它操作系统就失效。
GetAsyncKeyState返回值最高位为1则说明对应ch的键被按下,所以这里用&0x8000来判断最高位。
四、想要捕获其它软件界面内容还有很多方法,比如:
1、通过windowAPI函数FindWindow来获取窗口句柄。
2、遍历窗口下控件句柄,找到输入框句柄。
3、通过窗口句柄找到进程id(GetWindowThreadProcessId函数),再通过id获取进程句柄(OpenProcess函数)。
4、向目标进程申请内存(VirtualAllocEx),再通过PostMessage函数异步发送消息获取目标控件内的内容(具体消息要结合控件类型,另外注意PostMessage是异步执行)。
具体自行查阅资料,一言两语说不清,上面步骤需先搞懂window消息机制。
注意:以上方法依然只限window系统,且有数据保护的控件无法获取。
五、或简单暴力的方法,直接写个定时截图,只要硬盘够不停桌面截图。
但不论写什么程序,和装摄像头一样,终究都会被发现。!!!!!!!!!!!!!
㈢ C语言 Asynchronous_send 我用 Asynchronous_send(j/100);
j/100=0
这大概不是没有输出,而是输出一个不可见字符,而你根据打印结果看是否有输出,当然不正确
至于'j/100'只输出一个j,记住这个函数是异步发送,你恐怕还得等好久才能收完,接收方要不断接收才能得到结果
㈣ c51单片机 C语言问3和4道题
异步串行通信是指通信双方以一个字符(包括特定附加位)作为数据传格单位且发送方传送字符的间隔时间不一定。同步串行通信是指允许连续发送一序列字符而每个字符的数据位数都相同且没有起始位和停止位。 异步串行通信是指通信中两个字节间的时间间隔是不固定的,而在同一个字节中的两个相邻位的时间间隔是固定的.。同步串行通信则是在通信过程中每个字节的时间间隔是相等的,而且每个字节的位的时间间隔也是固定的。异步通信数据帧的第一位是开始位,在通信线上没有数据传送时处于逻辑“1”状态。当发送设备要发送一个字符数据时,首先发出一个逻辑“0”信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,当接收设备检测到这个逻辑低电平后,就开始准备接收数据位信号。
㈤ c语言中UART是什么意识
Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置
一般就是串口了,比如单片机,PC都有的串口。
㈥ PIC单片机16F883 串行异步通信 c语言编程 请详细写出各个寄存器,串口的作用,谢谢了。
#include <pic.h>
#define FOSC 18432000L
#define BAUD 115200
#define NONE_PARITY 0 //无校验位
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空校验
#define PARITYBIT EVEN_PARITY
#define S2RI 0x01
#define S2TI 0x02
#define S2RB8 0x04
#define S2TB8 0x08
sfr AUXR = 0x8e;
sfr S2CON = 0x9a;
sfr S2BUF = 0x9b;
sfr BRT = 0x9c;
sfr IE2 = 0xaf;
bit busy;
void SendData(char dat);
void SendString(char *s);
void main()
{
#if (PARITYBIT == NONE_PARITY)
S2CON = 0x5a; //8位可变波特率 (无校验位)
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
S2CON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
S2CON = 0xd5; //9位可变波特率,校验位初始为0
#endif
BRT = -(FOSC/32/BAUD); //设置独立波特率发生器的重载初值
AUXR = 0x14; //独立波特率发生器工作在1T模式
IE2 = 0x01; //使能串口2中断
EA = 1; //开总中断
SendString("STC12C5A60S2\r\nUart2 Test !\r\n");
while(1);
}
void Uart2() interrupt 8 using 1
{
if (S2CON & S2RI)
{
S2CON &= ~S2RI; //清除接收完成标志
P0 = S2BUF; //P0显示串口数据
P2 = (S2CON & S2RB8); //P2.2显示校验位
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI; //清除发送完成标志
busy = 0;
}
}
void SendData(char dat)
{
while (busy); //等待上个数据发送完成
ACC = dat; //取得偶校验位P
if (P) //根据P来设置串口数据的校验位
{
#if (PARITYBIT == ODD_PARITY)
S2CON &= ~S2TB8; //置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
S2CON |= S2TB8; //置校验位为1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
S2CON |= S2TB8; //置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
S2CON &= ~S2TB8; //置校验位为0
#endif
}
busy = 1;
S2BUF = ACC; //发送数据
}
void SendString(char *s)
{
while (*s) //判断字符串结束标志
{
SendData(*s++); //发送字符
}
}
㈦ 怎样写socket要求异步通信的,能传输不大于1mb的文件,用C语言的版本
使用UDP
查看下linux关于socket的相关函数,给你写个简单的实例:
include.h:
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>
#include<netinet/in.h>
#include<netdb.h>
#include<sys/socket.h>
#include<errno.h>
接收代码:
#include"include.h"
#define port 9999
#define LENGTH 1024
struct str
{
int type;
char buff[LENGTH];
};
void rcv(int sock)
{
struct sockaddr_in addr;
int length,n;
int running=1;
struct str frame;
char buffer[2000];
while(running)
{
bzero(&frame,sizeof(struct str));
length=sizeof(struct sockaddr);
n=recvfrom(sock,(struct str*)&frame,sizeof(struct str),0,(struct sockaddr *)&addr,&length);
//memcpy(&frame,buffer,sizeof(struct str));
printf("Server has recieved %s !\n",frame.buff);
puts(frame.buff);
printf("Server has recieved sending type %d !\n",frame.type);
}
}
int main(void)
{
int sock_fd;
struct sockaddr_in addr;
if((sock_fd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
printf("Error in socket!\n");
exit(1);
}
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(port);
if(bind(sock_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
{
printf("Error in bind!\n");
exit(1);
}
rcv(sock_fd);
close(sock_fd);
}
发送代码:
#include"include.h"
#define port 9999
#define LENGTH 1024
struct str
{
int type;
char buff[LENGTH];
};
void snd(int sock)
{
int n;
struct sockaddr_in addr;
struct str frame;
char ipaddr[15];
int running=1;
char content[1200];
while(running)
{
bzero(&frame,sizeof(struct str));
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
printf("please input the ip address!\n");
gets(ipaddr);
if(inet_aton(ipaddr,&addr.sin_addr)<0)
{
printf("Ip error!\n");
exit(1);
}
frame.type=5;
printf("please input the content which you wanna send!\n");
fgets((&frame)->buff,LENGTH,stdin);
printf("aim ip is ");
puts(ipaddr);
printf("the content you wanna send is %s !\n",(&frame)->buff);
printf("type is %d!\n",frame.type);
n=sendto(sock,(struct str *)&frame,sizeof(struct str),0,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
if(n<0)
{
printf("fail in sendto()\n");
exit(1);
}
bzero(&frame,sizeof(struct str));
}
}
int main(void)
{
int sock_fd;
if((sock_fd=(socket(AF_INET,SOCK_DGRAM,0)))<0)
{
printf("Error in socket()!\n");
exit(1);
}
snd(sock_fd);
close(sock_fd);
}
㈧ 用c语言单片机发一个正弦波 为何不写延时程序串口传数就会出错 延时程序: void delay(v
串口发送数据是异步发送,而且是一位一位的发送。
异步的意思是不需要同步时钟,通讯双方约定好时间,比如9600BPS,即每秒9600位数据,一位数据需要大约0.1毫秒。发送一个字节是8位,再加上起始位、终止位,可能还有校验位,大约在1毫秒左右。这就是说,9600BPS的通讯速率,每发送一个字节(大约)需要1毫秒的时间。
通常发送的时候不需要刻意的延时,而是通过检测标志状态的方法确定发送是否完成。比如
SBUF=A;
while( !TI ); // 这个状态检测就起延时的作用。如果没有这个发送完成的检测,delay(2ms)也可以。
TI = 0;
㈨ 【C语言Playsound】异步播放与同步播放
应无问题:
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
void main()
{
PlaySound (TEXT("zzd.wav"), NULL, SND_ASYNC | SND_NODEFAULT);
while (1)
{
printf("program is running... here\n");
Sleep(1000);
}
exit(0);
}
如果你的编译器支持中文,你把.wav 或 .wma 之类的 音频 文件名和 路径 换成 你的 E:\\路径\\文件名 便可。
㈩ 用C语言,向一个指定的的窗口发送固定的信息,怎么实现啊 希望能提供源代码参考。希望大家不吝赐教
先取得窗口的句柄,如果是前台窗口,可以用 GetForegroundwindow获取!
如果知道窗口名等,也可以用FindWindow获取窗口句柄!
然后用SendMessage发送消息即可