串口编程中使用MScommd的注意事项
在VC串口编程中通常使用的三种方法(利用MSComm控件,利用SerialPort类进行多串口编程,使用API通讯函数),相信大家都有比较的熟悉了。今天在这里主要讲一下在使用控件MScomm控件进行串口编程中要注意的地方。
代码中经常要注意的问题无外乎在于初始化,边缘检测,触发事件,类包含等几个问题
1,首先是初始化,这里以初始化com1口为例,具体见下面代码:
///////////////////////COM1///////////////////////////////////////
if(m_mscom.GetPortOpen())
m_mscom.SetPortOpen(FALSE);
m_mscom.SetCommPort(1); //选择com1
if( !m_mscom.GetPortOpen())
{
m_mscom.SetPortOpen(TRUE);//打开串口
m_staticchuan1="开启状态";
}
else
m_staticchuan1="关闭状态";
m_mscom.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
m_mscom.SetInputMode(1);
m_mscom.SetRThreshold(2); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_mscom.SetInputLen(0); //设置当前接收区数据长度为0
m_mscom.GetInput();//先预读缓冲区以清除残留数据
/////////////////////////////////////////////////////////////////////////////////////////////////////
相信大家都会设置初始化,但很多网友往往会忽视掉在初始化之前对串口是否打开与关闭的判断,这样在程序运行的时候时不时会出现一些错误。
2,
/***************************************************
*作者:万田
*时间:2006-09-18
*函数:OnMscomm1()串口一触发事件
****************************************************/
void CSpeedDlg::OnMscomm1() //串口一触发事件
{
VARIANT variant_inp;
COleSafeArray colesafearray_inp;
long k;
byte rxdata[3];//我这里定义三个字节,用来接收感应器的三个字符
CString strtemp;
if(m_mscom.GetCommEvent() == 2)
{
variant_inp = m_mscom.GetInput();
colesafearray_inp=variant_inp;
for(k=0;k<2;k++)//读取三个字节将数据读入到rxdata数组中,其中*为线圈标志,为从经过的时间
colesafearray_inp.GetElement(&k,rxdata+k);
//-------------一路地干器感应线圈识别程序
if(rxdata[0]==**)
{
//做相应的事件
}
if(rxdata[0]==**)
{
//做相应的事件
}
}
////////////////////////////////////////////////////////////////////////////////////////
这里特别要注意的是语句是:
for(k=0;k<2;k++)//读取三个字节将数据读入到rxdata数组中 colesafearray_inp.GetElement(&k,rxdata+k);
我这里定义的k不能超过2,因为我将读取的值只有2个字节长度。网友一定要清楚你所接受的字节长度,根据具体的字符长度来决定你的循环上限。
以这里为例,我将k<2变为k<3结果将会出现莫名的错误。 |
|
|
微机能否通过端口检测到电平信号?
悬赏分:20 - 解决时间:2006-10-16 11:39
我做一个控制系统,需要微机检测到外部发出的信号(比如一个高电平或者低电平),然后再去做别的。就象一个士兵时刻等待军官发出“开始执行”的命令一样,士兵需要接收到这个命令
提问者: 问彻底 - 试用期 一级
最佳答案
可以,你可以用rs-232串口(就是微机上9针的COM1和COM2)或着用并口(就是微机上25针的那个接口)。
用rs-232串口。它的2,3引脚为收发。你可以利用MSCOMMd等控件在VC,VB,DELPHI中很容易就可以写一个程序,也可以用windows API。当然你得知道232异步通信的规约,就是先得初始化串口,确定起始位数和停止位数目,你可以用停止位和起始位作为高低电平的检测。
用并口可以查一下D型25针Centronics的针脚定义,然后选一个针检测
初次接触mysql:c++ 连接mysql
今天要做个模拟实验要用到数据库,经同事介绍mysql很强大而且开源所以就试试怎么样,首先用c++连接mysql,具体程序如下,供以后参考! 注:你必须先保证你安装了mysql数据库,并把安装目录下的lib目录中的libmysql.dll和libmysql.lib复制到你新建的vs2005或者vc++ 6.0项目目录下,并把libmysql.lib引到项目中。
#include "stdafx.h"
#include <WinSock2.h> //定义socket
#include<iostream> #include "mysql.h"
using namespace std; int _tmain(int argc, _TCHAR* argv[]) { MYSQL mysql; mysql_init(&mysql); if (mysql_real_connect(&mysql,"localhost","root","密码","数据库名",3306,0,0)) { cout << "The connection is OK!" < <endl; return 0; } else { int i = mysql_errno(&mysql); const char * s = mysql_error(&mysql); cout << s << endl; } } |
|
|
C 语言链接 MySQL, (实例一)
用的是 mysql 自带的 LIB 包。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>
MYSQL* my_conn()
{
MYSQL *mysql;
/* 初始化指针 */
mysql = mysql_init(NULL);
/* 连接数据库 */
if(!(mysql = mysql_real_connect(mysql, "localhost", "root", "root", "test", 0, NULL, 0)))
{
printf("error!!%s\n", mysql_error(mysql));
exit(1);
}
printf(" 连接数据库成功!! \n");
return mysql;
}
/* 执行 sql 语句并返回 */
MYSQL_RES* execute_query(MYSQL* mysql, char *sql)
{
MYSQL_RES *res = NULL;
printf("sql:%s\n", sql);
/* 执行 SQL 语句 */
if(mysql_query(mysql,sql)) {
fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));
exit(1);
}
/* 返回结果集 */
if (!(res=mysql_store_result(mysql))) {
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(mysql));
exit(1);
}
/* 结果列数 */
printf("number of fields returned: %d\n",mysql_num_fields(res));
return res;
}
int main()
{
MYSQL *mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *qbuf;
mysql = my_conn();
qbuf = "select * from test";
/* printf("main sql:%s\n", qbuf);*/
res = execute_query(mysql, qbuf);
while(row = mysql_fetch_row(res))
{
printf("id=%s\t", row[0]);
printf("name=%s\t", row[1]);
printf("remark=%s\n", row[3]);
}
puts("query ok!!\n");
mysql_free_result(res);
mysql_close(mysql);
return 1;
}
C语言链接MYSQL数据库(实例二
1 #include <mysql.h>/*注意要包含这个头文件*/ 2 #include <string.h> 3 #include <stdlib.h> 4 #include <stdio.h> 5 6 /*定义了一些数据库连接需要的宏*/ 7 #define HOST "localhost" 8 #define USERNAME "ABitNo" 9 #define PASSWORD "ABitNo" 10 #define DATABASE "abitno" 11 12 /*这个函数用来执行传入的sql語句*/ 13 void exe_sql(char* sql) { 14 15 MYSQL my_connection; /*这是一个数据库连接*/ 16 int res; /*执行sql語句后的返回标志*/ 17 18 /*初始化mysql连接my_connection*/ 19 mysql_init(&my_connection); 20 21 /*这里就是用了mysql.h里的一个函数,用我们之前定义的那些宏建立mysql连接,并 22 返回一个值,返回不为空证明连接是成功的*/ 23 if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 24 0, NULL, CLIENT_FOUND_ROWS)) {/*连接成功*/ 25 26 printf("数据库执行exe_sql连接成功!\n"); 27 28 /*这句话是设置查询编码为utf8,这样支持中文*/ 29 mysql_query(&my_connection, "set names utf8"); 30 31 /*下面这句话就是用mysql_query函数来执行我们刚刚传入的sql語句, 32 这会返回一个int值,如果为0,证明語句执行成功*/ 33 res = mysql_query(&my_connection, sql); 34 35 if (res) {/*现在就代表执行失败了*/ 36 printf("Error: mysql_query !\n"); 37 /*不要忘了关闭连接*/ 38 mysql_close(&my_connection); 39 } else {/*现在就代表执行成功了*/ 40 /*mysql_affected_rows会返回执行sql后影响的行数*/ 41 printf("%d 行受到影响!\n\n", mysql_affected_rows(&my_connection)); 42 /*不要忘了关闭连接*/ 43 mysql_close(&my_connection); 44 } 45 46 } else { 47 /*数据库连接失败*/ 48 printf("数据库执行exe_sql连接失败!\n"); 49 } 50 } 51 52 /*这个函数用来执行传入的sql語句,并打印出查询結果*/ 53 void query_sql(char* sql) { 54 MYSQL my_connection; /*这是一个数据库连接*/ 55 int res; /*执行sql語句后的返回标志*/ 56 MYSQL_RES *res_ptr; /*指向查询结果的指针*/ 57 MYSQL_FIELD *field; /*字段结构指针*/ 58 MYSQL_ROW result_row; /*按行返回的查询信息*/ 59 60 int row, column; /*查询返回的行数和列数*/ 61 int i, j; /*只是控制循环的两个变量*/ 62 63 /*初始化mysql连接my_connection*/ 64 mysql_init(&my_connection); 65 66 /*这里就是用了mysql.h里的一个函数,用我们之前定义的那些宏建立mysql连接,并 67 返回一个值,返回不为空证明连接是成功的*/ 68 if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 69 0, NULL, CLIENT_FOUND_ROWS)) {/*Connection success*/ 70 71 printf("数据库查询query_sql连接成功!\n"); 72 73 /*这句话是设置查询编码为utf8,这样支持中文*/ 74 mysql_query(&my_connection, "set names utf8"); 75 76 /*下面这句话就是用mysql_query函数来执行我们刚刚传入的sql語句, 77 这会返回一个int值,如果为0,证明語句执行成功*/ 78 res = mysql_query(&my_connection, sql); 79 80 if (res) { /*现在就代表执行失败了*/ 81 printf("Error: mysql_query !\n"); 82 /*不要忘了关闭连接*/ 83 mysql_close(&my_connection); 84 } else { /*现在就代表执行成功了*/ 85 /*将查询的結果给res_ptr*/ 86 res_ptr = mysql_store_result(&my_connection); 87 88 /*如果结果不为空,就把结果print*/ 89 if (res_ptr) { 90 /*取得結果的行数和*/ 91 column = mysql_num_fields(res_ptr); 92 row = mysql_num_rows(res_ptr) + 1; 93 printf("查询到 %lu 行 \n", row); 94 95 /*输出結果的字段名*/ 96 for (i = 0; field = mysql_fetch_field(res_ptr); i++) 97 printf("%s\t", field->name); 98 printf("\n"); 99 100 /*按行输出結果*/ 101 for (i = 1; i < row; i++) { 102 result_row = mysql_fetch_row(res_ptr); 103 for (j = 0; j < column; j++) 104 printf("%s\t", result_row[j]); 105 printf("\n"); 106 } 107 108 } 109 110 /*不要忘了关闭连接*/ 111 mysql_close(&my_connection); 112 } 113 } 114 } 115 116 int main(int argc, char *argv[]) { 117 /*测试下向里面插入数据*/ 118 char *exe = "insert into abitno values('ABitNo','http://ABitNo.LinPie.com');"; 119 exe_sql(exe); 120 121 /*测试下查询*/ 122 char *query = "select * from abitno;"; 123 query_sql(query); 124 125 return 0; 126 }
C语言链接MYSQL数据库(实例三)
对于刚刚接触MySQL的用户,如果想用C语言连接MySQL,往往会是一件很麻烦的事情。这里就整理过程做一个详细的说明,以便参考。
概述:
MySQL为C语言提供了连接数据库的API,如连接数据库: MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name"); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(&mysql)); }
要想正常使用这些API,你需要做一下两件事情:
· 让你编译器找到这些API的可执行程序。(dll库)
详细步骤:
1.在你的C语言中加入如下声明: #include "windows.h" #include "mysql.h" int main(){ ...... }
那编译器如何才能找到mysql.h文件呢?需要做如下设置:
a) VC6.0中,在你的Project(项目),选择Tools菜单下的Options选项,在Directories的标签页中右边的“Show directories for:”下拉列表中选中“Includefiles”,然后在中间列表框中添加你本地安装MySQL的include目录路径。 (5.*版本的路径应该是:C:\\Program Files\\MySQL\\MySQL Server 5.0\\include)
b)至此,你的编译器就知道mysql的API接口有哪些函数,以及函数的原型是怎样的(mysql.h中)。你的C语言程序应该已经能够通过Compile(编译)这一步了
2.到上一步你的程序能够编译通过了,但是也只是能编译而已,想生成可执行程序这些还不够。还需要告诉编译器这些API函数的可执行文件在哪儿(libmysql.dll)。 VC6.0中,在你的Project(项目)中
a) 选择Tools菜单下的Options选项,在Directories的标签页中右边的“Show directories for:”下拉列表中选中“Library files”,然后添加你本地安装MySQL的Lib目录路径。 (5.*版本的路径应该是:C:\\Program Files\\MySQL\\MySQL Server 5.0\\lib\\debug 或者C:\\Program Files\\MySQL\\MySQL Server 5.0\\lib\\opt);
b) 选择“Project settings->Link:Object/library modules”,添加“libmysql.lib” [把建议将“libmySQL.lib、libmySQL.dll”拷到你所建的工程的目录下]
c) 在你的程序代码中加入: #include “mysql.h” #include “windows.h” #pragma comment(lib,”libmySQL.lib”)
3.这样就完成了所有的工作,你的源代码大概是这个样子:
#include "windows.h" #include "mysql.h" #pragma comment(lib,"libmySQL.lib") int main(){ MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name"); if(!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, "Failed to connect to database:Error:%s\n", mysql_error(&mysql)); } }
c++连mysql实例(四)
views(26) comments(0) last modified @ 2009-05-13 19:15:45
c++连mysql实例
2008-10-16 00:11// mysql11.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<stdlib.h> #include <stdio.h> #include <winsock.h> #include <mysql.h> #include <windows.h> #include <iostream> #pragma comment(lib, "libmysql.lib") int main(int argc, char* argv[]) { unsigned short Port = 3306; char *IPAddress = "daidai-sony"; char *UserName = "daidai"; char *Password = "daidai"; char *DBName = "daidai"; int i; printf("Start... "); MYSQL *con1 ; MYSQL_RES *res; MYSQL_ROW row; unsigned int num_fields; [break] con1 = mysql_init((MYSQL*) 0); con1 = mysql_real_connect(con1,IPAddress,UserName,Password, NULL, Port, NULL, 0); if(!con1) { printf("no con"); } else { printf("con..."); } con1->reconnect = 1; mysql_select_db(con1, DBName) ; if (!mysql_query(con1, "SELECT * FROM book")) { res = mysql_store_result(con1);
num_fields = mysql_num_fields(res); while ((row = mysql_fetch_row(res))) { unsigned long *lengths; lengths = mysql_fetch_lengths(res); for(i = 0; i < num_fields; i++) { printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL"); } printf("\n"); } } else { printf("Couldn't execute \"SELECT * FROM book\" on server.\n");
} std::cin.get(); }
|