2019年8月28日 星期三

[工具]Visual Studio Code (vscode)

官網下載點:
https://code.visualstudio.com/


推薦套件:

中文化
https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hant

c/c++
https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools

intelligent
https://marketplace.visualstudio.com/items?itemName=austin.code-gnu-global


參考設定:
https://kw0006667.wordpress.com/2017/01/31/%E9%80%8F%E9%81%8E-msbuild-%E5%9C%A8-visual-studio-code-%E7%B7%A8%E8%BC%AF%E5%9F%B7%E8%A1%8C-cc/



======後記=================

常見問題:  解決開檔亂碼問題

https://blog.xuite.net/anadachien/MyQuilt/490835461-%E5%A6%82%E4%BD%95%E8%A7%A3%E6%B1%BAMicrosoft+Visual+Studio+Code%E4%B8%80%E9%96%8B%E5%95%9F%E6%AA%94%E6%A1%88%E4%B8%AD%E6%96%87%E5%AD%97%E8%AE%8A%E4%BA%82%E7%A2%BC%E7%9A%84%E5%95%8F%E9%A1%8C

參考:解決方法--修改使用者設定檔。請點選[檔案]->[喜好設定]->[設定]->在settings.json檔案的右側[使用者設定]處輸入以下幾行設定。


    "files.encoding""shiftjis",
    "files.encoding""eucjp",
    "files.encoding""big5hkscs",
    "files.encoding""GB18030",
    "files.encoding""GBK",
    "files.encoding""utf8",
    "files.encoding""GB2312",
    "files.encoding""Big5",
    "files.autoGuessEncoding"true



2019年8月2日 星期五

[c++]Windows下C的計時器timeSetEvent

Sample:

UINT uRet = timeSetEvent(100, 100, &TimerSaveLog, (DWORD_PTR)this, TIME_ONESHOT);

void CALLBACK TimerSaveLog(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
if (!dwUser)
return;
return;
}


============================MSDN  分隔線==============================

MSDN裡定義的函數原型如下:

MMRESULT timeSetEvent(UINT uDelay,

                                             UINT uResolution,

                                             LPTIMECALLBACK fptc,

                                             DWORD dwUser,

                                             UINT fuEvent);

udelay的:以毫秒指定事件的週期。
uResolution:以毫秒指定延時的精度,數值越小定時器事件分辨率越高。缺省值為1ms。

fptc:指向一個回調函數。
dwUser:存放用戶提供的回調數據。

fuEvent:指定定時器事件類型:
TIME_ONESHOT:udelay的毫秒後只產生一次事件
TIME_PERIODIC:每隔uDelay毫秒週期性地產生事件。


============================我是分隔線==============================

sample:

#include "stdafx.h"
#include 
<stdio.h>
#include 
<Windows.h>
#include 
<Mmsystem.h>
#pragma comment(lib, "Winmm.lib")
void WINAPI onTimeFunc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2);int _tmain(int argc, _TCHAR* argv[])
{
    MMRESULT timer_id;
    
int n = 0;
    timer_id 
= timeSetEvent(50001, (LPTIMECALLBACK)onTimeFunc, DWORD(1), TIME_PERIODIC);
    
if(NULL == timer_id)
    {
        printf(
"timeSetEvent() failed with error %d\n", GetLastError());
        
return 0;
    }
    
while(n<20)
    {
        printf(
"Hello World\n");
        Sleep(
2000);
        n
++;
    }
    timeKillEvent(timer_id);        
//釋放定时器
    return 1;
}
void WINAPI onTimeFunc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
    printf(
"time out\n");
    
return;
}



引用來源

2019年7月18日 星期四

[CRC]循環冗餘碼計算

常見CRC檢查碼 Common CRC codes
最常見的CRC檢查碼位元數目有8、16、32,一般表示都是CRC-8、CRC-16、CRC-32,CRC編碼越長偵測能力越強大,然而得更多時間傳送更長CRC檢查碼,CRC-16能偵測一個區塊內一或兩個位元錯誤,或是奇數個位元錯誤,當資料位元長度超過17個時,偵錯率可高達99.9969%,而網路七層OSI模型第二層傳送的訊框(Frame)採用則是更高檢查碼位元CRC-32

----------------------------------------------------------------------------------------------

題目:
假設資料位元為10101010,生成多項式為x4+x2+x1+1 (10111)
問CRC碼以及加上CRC碼後的完整訊息為何? 
解法:(使用長除法解題)
步驟 1.
由於生成多項式x4+x2+x1+1 (10111) 的羃次為4 (因為最高 x4)
,故先在資料位元10101010的後面加上四個0 (0000) (若生成多項式是x3則補3個0的意思,此處是4,所以補4個0)
,得到被除數為101010100000

步驟 2. 
以長除法求取101010100000除以生成多項式x4+x2+x1+1 (10111) 的餘數

CRC用的是二進位除法,不能化為十進位做減法運算,相減時
1-1=00-0=01-0=10-1=1(不要借位)  
等同XOR運算 數字相同=0 相異=1(重要)

XOR
結果
0
0
0
0
1
1
1
0
1
1
1
0
開始計算 
使用長除法取101010100000除以生成多項式10111的餘數
長除法  
注意:第一個10101 不夠10111 減 還是可以做下來,因為他是等同於XOR
CRC碼為上述所求出的餘數1100,而完整訊息則是在原始的資料位元後面加上CRC碼,得到101010101100 ,只要收訊端有正確的接收到訊息,該訊息將能被生成多項式整除。
ANS: 10101010 1100
 驗算:101010101100再做一次長除法確實被10111整除 證明你剛剛算的沒有錯誤!

[RS232]UART Baud Rate計算

計算UART使用9600bps速度時的傳送時間
單位bit傳送時間 = 1/9600bps = 1.041×10-4(秒)
1Byte傳送時間 = 1.041×10-4×10bit = 1.041×10-3(秒)
(1Start Bit + 8Data Bits + 1Stop Bit = 10bits)

範例:
指令:01 10 0001 0008 10 0005 0005 0005 0005 0005 0005 0005 0005 8A84
指令長度 = 25byte
所需時間為 25bytes × 1.041×10-3  =  26×10-3 ≒ 0.026秒


2019年6月19日 星期三

[C++]MFC使用元件/物件 實現按鈕的啟用或禁用 (enable / disabled)

((CButton*)GetDlgItem(按鈕ID))->EnableWindow(FALSE);//禁用按鈕
((CButton*)GetDlgItem(按鈕ID))->EnableWindow(TRUE);//啟用按鈕


範例:

GetDlgItem(IDC_RADIO)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT6)->EnableWindow(TRUE);


環境:MFC 2015

2019年6月5日 星期三

[C++]隨機亂數 用法 rand()

#include <iostream>
#include<stdlib.h>
#include <time.h>


srand(time(NULL));//此行每次都加表示每次都會重新刷新
int tenbuf = int((rand() % 10) + 1);//1~10
int hubuf = int((rand() % 100) + 1);//1~100

測試環境 mfc c++空專案 

2019年5月21日 星期二

[C++]char* to int atoi

C庫函數 int atoi(const char *str) 轉換為字符串參數str為整數(int型)。 

int atoi(const char *str)

str -- 這是一個整數的字符串表示形式。

int val;
char str[20];
strcpy(str, "123456");
val = atoi(str);
//String value = 123456, Int value = 123456
 
strcpy(str, ".net");
val = atoi(str);
//String value = .net, Int value = 0


測試環境: vs 2015 mfc

[SQL]顯示千分位與小數顯示

  CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) CONVERT style參數說明 1  (expression為 money 或 smallmoney型別): 0 : 預設,保留小數位後兩位,並四捨...