Transcript SIOC-01-VCP

SIOC
實驗1:Virtual COM Port(VCP)
黃彥翔 /陳慶瀚
MIAT實驗室
WU-YANG
Technology Co., Ltd.
大綱
 實驗目的
 甚麼是Virtual COM Port
 Virtual COM Port的USB與USART的運作
 實驗項目
實驗目的
 使用USB介面模擬RS232 COM Port功能,可對超級終
端機進行文字I/O通訊實驗
甚麼是Virtual COM Port
 virtual COM Port 是由一個 驅動程式所產生的一個虛擬
COM Port
 簡單的說,Virtual COM Port就是USB轉RS232的介面
Virtual COM Port的IO種類
 VCP的IO有兩組
 VCP-to-PC
 VCP-to-device
USART
DEVICE
USB
VCP
(SIOC)
 VCP的兩端,各有buffer在接收資料
 USB_Rx_Buffer
 USART_Rx_Buffer
PC
VirtualCOMPort to PC的運作
 函式介紹
 控制I/O的兩種方法
 實驗
USB
VCP
(SIOC)
PC
VirtualCOMPort to PC的運作-- "hw_config.c"

void VCP_To_USB(uint8_t * buffer, int length)
{
int cnt;
for(cnt=0;cnt<length;cnt++){
if (linecoding.datatype == 7){
USART_Rx_Buffer[USART_Rx_ptr_in] = buffer[cnt]&
0x7F;
}
else if (linecoding.datatype == 8) {
USART_Rx_Buffer[USART_Rx_ptr_in] = buffer[cnt];
}
USART_Rx_ptr_in++;
/* To avoid buffer overflow */
if(USART_Rx_ptr_in == USART_RX_DATA_SIZE){
USART_Rx_ptr_in = 0;
}
}
}
Virtual COM Port的IO方法一
 存取陣列元素的方式控制I/O
EX:
uint8_t Buffer [50]={1,2,3,4,5};
length = strlen(buffer);
VCP_To_USB(buffer, length);
Virtual COM Port的IO方法二
 將stdio.h裡的printf()導向Virtual COM Port的方式實現
I/O控制
實驗一
 請用printf()在超級終端機持續印出”Hello, SIOC”,並
且使用Delay()函式製造間隔時間
PC to VirtualCOMPort的運作
 函式介紹
 控制I/O的兩種方法
 實驗
USB
VCP
(SIOC)
PC
PC to VirtualCOMPort的運作-- "usb_endp.c"
 void EP3_OUT_Callback(void)
{
uint16_t USB_Rx_Cnt;
/* Get the received data buffer and update the counter */
USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);
/* USB data will be immediately processed, this allow next USB
traffic beeing
NAKed till the end of the USART Xfet */
USB_To_USART_Send_Data(USB_Rx_Buffer, USB_Rx_Cnt);
}
PC to Virtual COM Port的IO方法一
 存取陣列元素的方式控制I/O
EX:
uint8_t data_buffer [80];
uint8_t index = 0;
while(1){
while(USB_Rx_Cnt==0){}
for(CHAR_Rx_Cnt; CHAR_Rx_Cnt<USB_Rx_Cnt;
CHAR_Rx_Cnt++, index++){
buffer[index] = USB_Rx_Buffer[CHAR_Rx_Cnt];
}
USB_Rx_Cnt = 0;
}
index = 0;
Virtual COM Port的IO方法二
 將stdio.h裡的scanf()導向Virtual COM Port的方式實現
I/O控制
實驗二
 設計一個簡易計算機程式讓使用者輸入兩個數值,然後
輸出運算結果
Scanf() type specifiers
type
Qualifying Input
Type of
argument
c
Single character
char *
d
Decimal integer
int *
e,E,f,g,G
Floating point
float *
o
Octal integer
int *
s
String of characters.
char *
u
Unsigned decimal
integer.
unsigned int *
x,X
Hexadecimal integer.
int *
實驗二
 當你連接Virtual COM Port後,程式第一行Printf()內的
字串是否沒有顯示出來?
 Why?
 Solution?
利用scanf來讀取一個字串
 用scanf來讀字串, 字串中不能有空白. 若有空白會被當
成兩個不同的字串
#include “stdio.h “
int main(void)
{
char a[80];
getchar();
printf(“enter number.");
scanf("%s",&a);
printf("%s \n",a);
}
實驗三—計算BMI
 在超級終端機可以輸入姓名、身高、體重,並秀出計算
名字與診斷結果
 BMI公式:BMI = 體重 (kg) / 身高 (m2)
成人的體重分級與標準
成人的體重分級與標
準
級
身體質量指數
分
體重過輕
BMI < 18.5
體重過輕
正常範圍
18.5 ≦ BMI <24
正常範圍
分
過
重
24 ≦ BMI
過
級
重
綜合演練
 設計一個程式,可以驗證使用者的身分證字號是否正確
 程式目的
 統合上述三項實驗的重點
 char轉int的程式練習
綜合演練
 第一個步驟先把你的身分證字號格式化
A
X1
X2
1
2
3
4
5
6
7
8
9
D1
D2
D3
D4
D5
D6
D7
D8
D9
 接著看這個表
A
B
C
D
E
F
G
H
J
10
11
12
13
14
15
16
17
18
K
L
M
N
P
Q
R
S
T
19
20
21
22
23
24
25
26
27
U
V
X
Y
W
Z
I
O
28
29
30
31
32
33
34
35
綜合演練
 把英文字,依據上面那個表,拆成兩個數字,分別填到
X1 X2
1
0
1
2
3
4
5
6
7
8
9
X1
X2
D1
D2
D3
D4
D5
D6
D7
D8
D9
 用公式將數字加總:
 Y=X1 + X2*9 + D1*8 + D2*7 + D3*6 + D4*5 + D5*4
+ D6*3 + D7*2 + D8*1 + D9*1
 Y若能夠被10整除,則為正確之身份証號碼
附錄—注意事項
在開始寫程式之前…
在VCP的範例中
使用程式最佳化
會有問題,故將
最佳化功能取消
Software Driver
 第一次連接STM Virtual COM Port,若是電腦沒有成功
安裝驅動,可手動指定驅動程式位置
 Software Driver – stmcdc.inf
在開始連接SIOC之前…
裝置的COM 可在裝置管理員
中查詢
裝置的預設傳輸速率(Baud
rate)
設定為“無”
在開始連接SIOC之前…
 檔案—內容
Q&A
WU-YANG
Technology Co., Ltd.