串口編程中使用MScommd的注意事項
在VC串口編程中通常使用的三種方法(利用MSComm控件,,利用SerialPort類進行多串口編程,使用API通訊函數(shù)),相信大家都有比較的熟悉了,。今天在這里主要講一下在使用控件MScomm控件進行串口編程中要注意的地方,。
代碼中經(jīng)常要注意的問題無外乎在于初始化,,邊緣檢測,,觸發(fā)事件,類包含等幾個問題
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="開啟狀態(tài)";
}
else
m_staticchuan1="關(guān)閉狀態(tài)";
m_mscom.SetSettings("9600,n,8,1"); //波特率9600,,無校驗,,8個數(shù)據(jù)位,1個停止位
m_mscom.SetInputMode(1);
m_mscom.SetRThreshold(2); //參數(shù)1表示每當串口接收緩沖區(qū)中有多于或等于1個字符時將引發(fā)一個接收數(shù)據(jù)的OnComm事件
m_mscom.SetInputLen(0); //設置當前接收區(qū)數(shù)據(jù)長度為0
m_mscom.GetInput();//先預讀緩沖區(qū)以清除殘留數(shù)據(jù)
/////////////////////////////////////////////////////////////////////////////////////////////////////
相信大家都會設置初始化,,但很多網(wǎng)友往往會忽視掉在初始化之前對串口是否打開與關(guān)閉的判斷,,這樣在程序運行的時候時不時會出現(xiàn)一些錯誤。
2,,
/***************************************************
*作者:萬田
*時間:2006-09-18
*函數(shù):OnMscomm1()串口一觸發(fā)事件
****************************************************/
void CSpeedDlg::OnMscomm1() //串口一觸發(fā)事件
{
VARIANT variant_inp;
COleSafeArray colesafearray_inp;
long k;
byte rxdata[3];//我這里定義三個字節(jié),用來接收感應器的三個字符
CString strtemp;
if(m_mscom.GetCommEvent() == 2)
{
variant_inp = m_mscom.GetInput();
colesafearray_inp=variant_inp;
for(k=0;k<2;k++)//讀取三個字節(jié)將數(shù)據(jù)讀入到rxdata數(shù)組中,,其中*為線圈標志,,為從經(jīng)過的時間
colesafearray_inp.GetElement(&k,rxdata+k);
//-------------一路地干器感應線圈識別程序
if(rxdata[0]==**)
{
//做相應的事件
}
if(rxdata[0]==**)
{
//做相應的事件
}
}
////////////////////////////////////////////////////////////////////////////////////////
這里特別要注意的是語句是:
for(k=0;k<2;k++)//讀取三個字節(jié)將數(shù)據(jù)讀入到rxdata數(shù)組中 colesafearray_inp.GetElement(&k,rxdata+k);
我這里定義的k不能超過2,因為我將讀取的值只有2個字節(jié)長度,。網(wǎng)友一定要清楚你所接受的字節(jié)長度,,根據(jù)具體的字符長度來決定你的循環(huán)上限。
以這里為例,,我將k<2變?yōu)?/SPAN>k<3結(jié)果將會出現(xiàn)莫名的錯誤,。 |
|
|
微機能否通過端口檢測到電平信號,?
懸賞分:20 - 解決時間:2006-10-16 11:39
我做一個控制系統(tǒng),需要微機檢測到外部發(fā)出的信號(比如一個高電平或者低電平),,然后再去做別的,。就象一個士兵時刻等待軍官發(fā)出“開始執(zhí)行”的命令一樣,士兵需要接收到這個命令
提問者: 問徹底 - 試用期 一級
最佳答案
可以,,你可以用rs-232串口(就是微機上9針的COM1和COM2)或著用并口(就是微機上25針的那個接口),。
用rs-232串口。它的2,3引腳為收發(fā),。你可以利用MSCOMMd等控件在VC,VB,DELPHI中很容易就可以寫一個程序,,也可以用windows API。當然你得知道232異步通信的規(guī)約,,就是先得初始化串口,,確定起始位數(shù)和停止位數(shù)目,你可以用停止位和起始位作為高低電平的檢測,。
用并口可以查一下D型25針Centronics的針腳定義,,然后選一個針檢測
初次接觸mysql:c++ 連接mysql
今天要做個模擬實驗要用到數(shù)據(jù)庫,經(jīng)同事介紹mysql很強大而且開源所以就試試怎么樣,,首先用c++連接mysql,,具體程序如下,供以后參考,! 注:你必須先保證你安裝了mysql數(shù)據(jù)庫,,并把安裝目錄下的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","密碼","數(shù)據(jù)庫名",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);
/* 連接數(shù)據(jù)庫 */
if(!(mysql = mysql_real_connect(mysql, "localhost", "root", "root", "test", 0, NULL, 0)))
{
printf("error!!%s\n", mysql_error(mysql));
exit(1);
}
printf(" 連接數(shù)據(jù)庫成功!,! \n");
return mysql;
}
/* 執(zhí)行 sql 語句并返回 */
MYSQL_RES* execute_query(MYSQL* mysql, char *sql)
{
MYSQL_RES *res = NULL;
printf("sql:%s\n", sql);
/* 執(zhí)行 SQL 語句 */
if(mysql_query(mysql,sql)) {
fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));
exit(1);
}
/* 返回結(jié)果集 */
if (!(res=mysql_store_result(mysql))) {
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(mysql));
exit(1);
}
/* 結(jié)果列數(shù) */
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數(shù)據(jù)庫(實例二
1 #include <mysql.h>/*注意要包含這個頭文件*/ 2 #include <string.h> 3 #include <stdlib.h> 4 #include <stdio.h> 5 6 /*定義了一些數(shù)據(jù)庫連接需要的宏*/ 7 #define HOST "localhost" 8 #define USERNAME "ABitNo" 9 #define PASSWORD "ABitNo" 10 #define DATABASE "abitno" 11 12 /*這個函數(shù)用來執(zhí)行傳入的sql語句*/ 13 void exe_sql(char* sql) { 14 15 MYSQL my_connection; /*這是一個數(shù)據(jù)庫連接*/ 16 int res; /*執(zhí)行sql語句后的返回標志*/ 17 18 /*初始化mysql連接my_connection*/ 19 mysql_init(&my_connection); 20 21 /*這里就是用了mysql.h里的一個函數(shù),,用我們之前定義的那些宏建立mysql連接,并 22 返回一個值,,返回不為空證明連接是成功的*/ 23 if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 24 0, NULL, CLIENT_FOUND_ROWS)) {/*連接成功*/ 25 26 printf("數(shù)據(jù)庫執(zhí)行exe_sql連接成功,!\n"); 27 28 /*這句話是設置查詢編碼為utf8,這樣支持中文*/ 29 mysql_query(&my_connection, "set names utf8"); 30 31 /*下面這句話就是用mysql_query函數(shù)來執(zhí)行我們剛剛傳入的sql語句,, 32 這會返回一個int值,,如果為0,證明語句執(zhí)行成功*/ 33 res = mysql_query(&my_connection, sql); 34 35 if (res) {/*現(xiàn)在就代表執(zhí)行失敗了*/ 36 printf("Error: mysql_query !\n"); 37 /*不要忘了關(guān)閉連接*/ 38 mysql_close(&my_connection); 39 } else {/*現(xiàn)在就代表執(zhí)行成功了*/ 40 /*mysql_affected_rows會返回執(zhí)行sql后影響的行數(shù)*/ 41 printf("%d 行受到影響,!\n\n", mysql_affected_rows(&my_connection)); 42 /*不要忘了關(guān)閉連接*/ 43 mysql_close(&my_connection); 44 } 45 46 } else { 47 /*數(shù)據(jù)庫連接失敗*/ 48 printf("數(shù)據(jù)庫執(zhí)行exe_sql連接失?。?/SPAN>\n"); 49 } 50 } 51 52 /*這個函數(shù)用來執(zhí)行傳入的sql語句,并打印出查詢結(jié)果*/ 53 void query_sql(char* sql) { 54 MYSQL my_connection; /*這是一個數(shù)據(jù)庫連接*/ 55 int res; /*執(zhí)行sql語句后的返回標志*/ 56 MYSQL_RES *res_ptr; /*指向查詢結(jié)果的指針*/ 57 MYSQL_FIELD *field; /*字段結(jié)構(gòu)指針*/ 58 MYSQL_ROW result_row; /*按行返回的查詢信息*/ 59 60 int row, column; /*查詢返回的行數(shù)和列數(shù)*/ 61 int i, j; /*只是控制循環(huán)的兩個變量*/ 62 63 /*初始化mysql連接my_connection*/ 64 mysql_init(&my_connection); 65 66 /*這里就是用了mysql.h里的一個函數(shù),,用我們之前定義的那些宏建立mysql連接,,并 67 返回一個值,返回不為空證明連接是成功的*/ 68 if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 69 0, NULL, CLIENT_FOUND_ROWS)) {/*Connection success*/ 70 71 printf("數(shù)據(jù)庫查詢query_sql連接成功,!\n"); 72 73 /*這句話是設置查詢編碼為utf8,,這樣支持中文*/ 74 mysql_query(&my_connection, "set names utf8"); 75 76 /*下面這句話就是用mysql_query函數(shù)來執(zhí)行我們剛剛傳入的sql語句, 77 這會返回一個int值,,如果為0,,證明語句執(zhí)行成功*/ 78 res = mysql_query(&my_connection, sql); 79 80 if (res) { /*現(xiàn)在就代表執(zhí)行失敗了*/ 81 printf("Error: mysql_query !\n"); 82 /*不要忘了關(guān)閉連接*/ 83 mysql_close(&my_connection); 84 } else { /*現(xiàn)在就代表執(zhí)行成功了*/ 85 /*將查詢的結(jié)果給res_ptr*/ 86 res_ptr = mysql_store_result(&my_connection); 87 88 /*如果結(jié)果不為空,就把結(jié)果print*/ 89 if (res_ptr) { 90 /*取得結(jié)果的行數(shù)和*/ 91 column = mysql_num_fields(res_ptr); 92 row = mysql_num_rows(res_ptr) + 1; 93 printf("查詢到 %lu 行 \n", row); 94 95 /*輸出結(jié)果的字段名*/ 96 for (i = 0; field = mysql_fetch_field(res_ptr); i++) 97 printf("%s\t", field->name); 98 printf("\n"); 99 100 /*按行輸出結(jié)果*/ 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 /*不要忘了關(guān)閉連接*/ 111 mysql_close(&my_connection); 112 } 113 } 114 } 115 116 int main(int argc, char *argv[]) { 117 /*測試下向里面插入數(shù)據(jù)*/ 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數(shù)據(jù)庫(實例三)
對于剛剛接觸MySQL的用戶,,如果想用C語言連接MySQL,,往往會是一件很麻煩的事情。這里就整理過程做一個詳細的說明,,以便參考,。
概述:
MySQL為C語言提供了連接數(shù)據(jù)庫的API,如連接數(shù)據(jù)庫: 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的可執(zhí)行程序,。(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接口有哪些函數(shù),,以及函數(shù)的原型是怎樣的(mysql.h中),。你的C語言程序應該已經(jīng)能夠通過Compile(編譯)這一步了
2.到上一步你的程序能夠編譯通過了,但是也只是能編譯而已,,想生成可執(zhí)行程序這些還不夠,。還需要告訴編譯器這些API函數(shù)的可執(zhí)行文件在哪兒(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(); }
|