您的位置:首页 > 其它

iPhone serial port communication

2011-06-25 13:43 267 查看
http://devdot.wikispaces.com/Iphone+Serial+Port+Tutorial

Requirement:

1.Jailbroken Iphone with BSD Subsystem installed (Search the web for jailbreak tutorials)

2.Iphone development toolchain for Mac OSX, Linux, Windows (Cygwin) or
other OS. I use this http://code.google.com/p/winchain/ in Windows.

3.Sparkfun Ipod connector or breakout board see http://www.sparkfun.com/commerce/product_info.php?products_id=633 or http://www.sparkfun.com/commerce/product_info.php?products_id=8295
4.PC USB UART – optional, but used in this tutorial. You will need
either a 3.3V level UART for PC (see http://www.sparkfun.com/commerce/product_info.php?products_id=718) or
you will need an old style 12V level serial cable with a level converter
like this one http://www.compsys1.com/workbench/On_top_of_the_Bench/Max233_Adapter/max233_adapter.html (see warning below)

5.A soldering iron will help you out


6.Microsoft Visual Studio – optional, but used in the source code examples for the PC serial port communication.

WARNING! Do not try to use a 12V level RS232 port for this without a
level converter to ~3V, it will severely damage your Iphone or render it
non-functional.

Hardware:

The Dock Port

In the Ipod/Iphone dock port, the pins we are concerned with are as follows

Pin 1

Ground

Pin 18

3.3V Power (+)

Pin 12

TX also known as Serial Transmit

Pin 13

RX also known as Serial Receive

To see a full description of all of the pins in the dock connector, see here: http://pinouts.ru/Devices/ipod_pinout.shtml
Connections: iPhone/iPod Touch RX should connect to TX of the
connected device, TX to RX of the connected device, and Ground to the
Ground of the connected device. If your device can be powered by a low
amperage, 3.3V power source you may chose to connect PIN 18 as well and
power your device directly from the iPhone/iPod Touch.

Sample Codes:

001

#include <stdio.h>   /* Standard input/output definitions */

002

#include <string.h>  /* String function definitions */

003

#include <unistd.h>  /* UNIX standard function definitions */

004

#include <fcntl.h>   /* File control definitions */

005

#include <errno.h>   /* Error number definitions */

006

#include <termios.h> /* POSIX terminal control definitions */

007

008

static struct termios gOriginalTTYAttrs;

009

010

static int OpenSerialPort()

011

{

012


intfileDescriptor = -1;

013


inthandshake;

014


struct termios  options;

015

016


// Open the serial port read/write, with no controlling terminal, and don't wait for a connection.

017


// The O_NONBLOCK flag also causes subsequent I/O on the device to be non-blocking.

018


// See open(2) ("man 2 open") for details.

019

020


fileDescriptor = open("/dev/tty.iap", O_RDWR | O_NOCTTY | O_NONBLOCK);

021


if (fileDescriptor == -1)

022


{

023


printf("Error opening serial port %s - %s(%d)./n",

024

   

"/dev/tty.iap", strerror(errno), errno);

025


goto error;

026


}

027

028


// Note that open() follows POSIX semantics: multiple open() calls to the same file will succeed

029


// unless the TIOCEXCL ioctl is issued. This will prevent additional opens except by root-owned

030


// processes.

031


// See tty(4) ("man 4 tty") and ioctl(2) ("man 2 ioctl") for details.

032

033


if (ioctl(fileDescriptor, TIOCEXCL) == -1)

034


{

035


printf("Error setting TIOCEXCL on %s - %s(%d)./n",

036


"/dev/tty.iap", strerror(errno), errno);

037


goto error;

038


}

039

040


// Now that the device is open, clear the O_NONBLOCK flag so subsequent I/O will block.

041


// See fcntl(2) ("man 2 fcntl") for details.

042

043


if (fcntl(fileDescriptor, F_SETFL, 0) == -1)

044


{

045


printf("Error clearing O_NONBLOCK %s - %s(%d)./n",

046


"/dev/tty.iap", strerror(errno), errno);

047


goto error;

048


}

049

050


// Get the current options and save them so we can restore the default settings later.

051


if (tcgetattr(fileDescriptor, &gOriginalTTYAttrs) == -1)

052


{

053


printf("Error getting tty attributes %s - %s(%d)./n",

054


"/dev/tty.iap", strerror(errno), errno);

055


goto error;

056


}

057

058


// The serial port attributes such as timeouts and baud rate are set by modifying the termios

059


// structure and then calling tcsetattr() to cause the changes to take effect. Note that the

060


// changes will not become effective without the tcsetattr() call.

061


// See tcsetattr(4) ("man 4 tcsetattr") for details.

062

063


options = gOriginalTTYAttrs;

064

065


// Print the current input and output baud rates.

066


// See tcsetattr(4) ("man 4 tcsetattr") for details.

067

068


printf("Current input baud rate is %d/n", (int) cfgetispeed(&options));

069


printf("Current output baud rate is %d/n", (int) cfgetospeed(&options));

070

071


// Set raw input (non-canonical) mode, with reads blocking until either a single character

072


// has been received or a one second timeout expires.

073


// See tcsetattr(4) ("man 4 tcsetattr") and termios(4) ("man 4 termios") for details.

074

075


cfmakeraw(&options);

076


options.c_cc[VMIN] = 1;

077


options.c_cc[VTIME] = 10;

078

079


// The baud rate, word length, and handshake options can be set as follows:

080

081


cfsetspeed(&options, B19200);// Set 19200 baud

082


options.c_cflag |= (CS8);  // RTS flow control of input

083

084


printf("Input baud rate changed to %d/n", (int) cfgetispeed(&options));

085


printf("Output baud rate changed to %d/n", (int) cfgetospeed(&options));

086

087


// Cause the new options to take effect immediately.

088


if (tcsetattr(fileDescriptor, TCSANOW, &options) == -1)

089


{

090


printf("Error setting tty attributes %s - %s(%d)./n",

091


"/dev/tty.iap", strerror(errno), errno);

092


goto error;

093


}

094


// Success

095


return fileDescriptor;

096

097


// Failure "/dev/tty.iap"

098

error:

099


if (fileDescriptor != -1)

100


{

101


close(fileDescriptor);

102


}

103

104


return -1;

105

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: